MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Consulta agregada do Mongodb em registros específicos em vez de coleção


Use o $match operador para filtrar os documentos que chegam ao seu pipeline.

Obtenha a lista de IDs de pedidos (para usar no $match pipeline com $in ) usando o find() map() do cursor método:
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 } } }
])

Para MongoDB 3.2, use o $lookup operador que faz uma junção externa esquerda a uma coleção não fragmentada no mesmo banco de dados para filtrar documentos da coleção "juntada" para processamento.

O exemplo a seguir mostra como você pode executar a operação de agregação nos orders coleção juntando os documentos de pedidos com os documentos da entrega coleção usando o campo order da entrega coleção:
db.orders.aggregate([
    {
        "$lookup": {
            "from": "delivery",
            "localField": "_id",
            "foreignField": "order",
            "as": "delivery_orders"
        }
    },
    { "$match": { "delivery_orders.status": "DELIVERED" } },    
    { "$group": { "_id": "$customer", "orders": { "$sum": 1 } } }
])