MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Requête agrégée Mongodb sur des enregistrements spécifiques au lieu de la collecte

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