Utilisez le $match
opérateur pour filtrer les documents entrant dans votre pipeline.
Obtenez la liste des identifiants de commande (à utiliser dans le $match
pipeline avec $in
) en utilisant find()
map()
du curseur
méthode :
var orderIds = db.delivery.find({"status": "DELIVERED"}).map(function(d){return d.order;});
db.orders.aggregate([
{ "$match": { "_id": { "$in": orderIds } } },
{ "$group": { "_id": "$customer", "orders": { "$sum": 1 } } }
])
Pour MongoDB 3.2, utilisez le $lookup
opérateur qui effectue une jointure externe gauche vers une collection non partitionnée dans la même base de données pour filtrer les documents de la collection "jointe" pour traitement.
L'exemple suivant montre comment exécuter l'opération d'agrégation sur les orders
collection joignant les documents des orders
avec les documents de la delivery
collecte en utilisant le champ order
dès la delivery
collecte :
db.orders.aggregate([
{
"$lookup": {
"from": "delivery",
"localField": "_id",
"foreignField": "order",
"as": "delivery_orders"
}
},
{ "$match": { "delivery_orders.status": "DELIVERED" } },
{ "$group": { "_id": "$customer", "orders": { "$sum": 1 } } }
])