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

Posso fare domanda perEach nella query aggregata in MongoDB?

Non puoi farlo con la pipeline di aggregazione. Dovresti capire che l'aggregazione MongoDB è una serie di operatori speciali applicati a una raccolta. Quando si esegue una pipeline di aggregazione, MongoDB convoglia gli operatori l'uno nell'altro, ovvero l'output di un operatore diventa l'input del seguente operatore. Il risultato di ogni operatore è una nuova raccolta di documenti.

Quindi ciò che stai cercando di ottenere in quanto sopra può essere semplicemente riscritto come la seguente pipeline senza la necessità di creare prima una serie di documenti:

var collection = db.collection('member'), 
    pipeline = [
        { "$match": { createdDate: currentDate, country: 'BD' } },
        {
            "$group": {
                "_id": { "memberType": "$memberType", "country": "$country" },
                "memberCount": { 
                    "$sum": { "$cond":[ { "$gt": ["$numberOfInvitees", 0] }, 1, 0 ] } 
                },
                "sameCount": { "$sum": 1 } 
            }
        }
    ];

collection.aggregate(pipeline, function(err, result){
    if (err) throw err;
    console.log(result);
});

AGGIORNAMENTO

In seguito alle modifiche alla tua domanda, l'esecuzione della seguente pipeline di aggregazione ti darà il risultato desiderato:

var collection = db.collection('member'), 
    pipeline = [   
        { "$match": { createdDate: currentDate, country: 'BD' } },
        {
            "$group": {
                "_id": { 
                    "memberType": "$memberType", 
                    "country": "$country" 
                },            
                "invitees":{ 
                    "$push":  {
                        "memberID": "$memberID",
                        "count": "$numberOfInvitees"
                    }
                },
                "inviteesList": { "$push": "$numberOfInvitees" },
                "memberCount": { "$sum": 1 } 
            }
        },
        { "$unwind": "$invitees" },
        { "$unwind": "$inviteesList" },
        { 
            "$group": {
                "_id": "$invitees.memberID",
                "sameInviteesCount": { 
                     "$sum": { 
                        "$cond": [ 
                            { "$eq": ["$inviteesList", "$invitees.count"] }, 
                            1, 0 
                        ] 
                    }
                },
                "lessInviteesCount": { 
                    "$sum": { 
                        "$cond":[ 
                            { "$lt": ["$inviteesList", "$invitees.count"] }, 
                            1, 0 
                        ] 
                    }
                },
                "memberCount": { "$first": "$memberCount" }
            }
        }
    ];

collection.aggregate(pipeline, function(err, result){
    if (err) throw err;
    console.log(result);
});