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

Puis-je postuler pourEach dans une requête agrégée dans MongoDB ?

Vous ne pouvez pas faire cela avec le pipeline d'agrégation. Vous devez comprendre que l'agrégation MongoDB est une série d'opérateurs spéciaux appliqués à une collection. Lorsque vous exécutez un pipeline d'agrégation, MongoDB relie les opérateurs les uns aux autres, c'est-à-dire que la sortie d'un opérateur devient l'entrée de l'opérateur suivant. Le résultat de chaque opérateur est une nouvelle collection de documents.

Par conséquent, ce que vous essayez d'accomplir dans ce qui précède peut être simplement réécrit comme le pipeline suivant sans qu'il soit nécessaire de créer d'abord un tableau de documents :

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

MISE À JOUR

Suite aux modifications apportées à votre question, l'exécution du pipeline d'agrégation suivant vous donnera le résultat souhaité :

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