Interroger les documents parents et enfants
Dans cette étape, nous allons explorer des techniques d'interrogation avancées pour récupérer des documents liés dans les collections parents et enfants de MongoDB. Nous allons démontrer comment trouver et joindre efficacement des données liées.
Requêtes de filtrage de base
Commençons par trouver les livres d'un auteur spécifique :
db.books.find({ author_id: ObjectId("author1") })
Filtrage avec plusieurs conditions
Interrogeons les livres avec plusieurs filtres :
db.books.find({
author_id: ObjectId("author1"),
published: { $gt: 1812 }
})
Cette requête trouve les livres de Jane Austen publiés après 1812.
Pipeline d'agrégation pour les requêtes complexes
Utilisons le cadre d'agrégation pour joindre les informations sur les auteurs et les livres :
db.books.aggregate([
{ $lookup: {
from: "authors",
localField: "author_id",
foreignField: "_id",
as: "author_details"
}},
{ $match: {
"author_details.nationality": "British"
}},
{ $project: {
title: 1,
published: 1,
"author_name": "$author_details.name"
}}
])
Exemple de sortie
[
{
_id: ObjectId(...),
title: 'Pride and Prejudice',
published: 1813,
author_name: ['Jane Austen']
},
{
_id: ObjectId(...),
title: 'Emma',
published: 1815,
author_name: ['Charles Dickens']
}
]
Tri et limitation des résultats
Interrogeons et trions les livres par année de publication :
db.books.find()
.sort({ published: 1 })
.limit(2)
Cela récupère les deux premiers livres publiés.
Filtrage avancé avec des expressions régulières
Trouvons les livres dont le titre contient des mots spécifiques :
db.books.find({
title: { $regex: /Sense/, $options: 'i' }
})
L'option $options: 'i'
rend la recherche insensible à la casse.
Compter les documents liés
Comptez les livres pour chaque auteur :
db.books.aggregate([
{ $group: {
_id: "$author_id",
book_count: { $sum: 1 }
}},
{ $lookup: {
from: "authors",
localField: "_id",
foreignField: "_id",
as: "author_info"
}},
{ $project: {
author_name: "$author_info.name",
book_count: 1
}}
])
Exemple de sortie
[
{
_id: ObjectId("author1"),
author_name: ['Jane Austen'],
book_count: 2
},
{
_id: ObjectId("author2"),
author_name: ['Charles Dickens'],
book_count: 2
}
]