MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Query aggregata Mongodb su record specifici anziché raccolta

Usa $match operatore per filtrare i documenti che entrano nella pipeline.

Ottieni l'elenco degli ID degli ordini (da utilizzare nel $match pipeline con $in ) utilizzando find() map() del cursore metodo:

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

Per MongoDB 3.2, usa $lookup operatore che esegue un join esterno sinistro a una raccolta non partizionata nello stesso database per filtrare i documenti dalla raccolta "unita" per l'elaborazione.

L'esempio seguente mostra come eseguire l'operazione di aggregazione sugli orders raccolta unendo i documenti da orders con i documenti della delivery ritiro utilizzando il campo order dalla delivery collezione:

db.orders.aggregate([
    {
        "$lookup": {
            "from": "delivery",
            "localField": "_id",
            "foreignField": "order",
            "as": "delivery_orders"
        }
    },
    { "$match": { "delivery_orders.status": "DELIVERED" } },    
    { "$group": { "_id": "$customer", "orders": { "$sum": 1 } } }
])