Verwenden Sie den $match
Operator, um die Dokumente zu filtern, die in Ihre Pipeline gelangen.
Rufen Sie die Liste der Auftrags-IDs ab (zur Verwendung im $match
Pipeline mit $in
) mithilfe von find()
map()
des Cursors
Methode:
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 } } }
])
Verwenden Sie für MongoDB 3.2 den $lookup
-Operator, der einen Left Outer Join mit einer unsharded-Sammlung in derselben Datenbank durchführt, um Dokumente aus der "verbundenen" Sammlung zur Verarbeitung einzufiltern.
Das folgende Beispiel zeigt, wie Sie die Aggregationsoperation für die orders
ausführen können Sammlung, die die Dokumente von orders
zusammenfügt mit den Dokumenten aus der delivery
Abholung über das Feld order
aus der delivery
Sammlung:
db.orders.aggregate([
{
"$lookup": {
"from": "delivery",
"localField": "_id",
"foreignField": "order",
"as": "delivery_orders"
}
},
{ "$match": { "delivery_orders.status": "DELIVERED" } },
{ "$group": { "_id": "$customer", "orders": { "$sum": 1 } } }
])