MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongodb aggregierte Abfrage auf bestimmte Datensätze statt Sammlung

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 } } }
])