MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Kann ich mich für jede Abfrage in aggregierter Form in MongoDB bewerben?

Mit der Aggregationspipeline ist das nicht möglich. Sie sollten verstehen, dass die MongoDB-Aggregation eine Reihe spezieller Operatoren ist, die auf eine Sammlung angewendet werden. Wenn Sie eine Aggregationspipeline ausführen, leitet MongoDB Operatoren ineinander, d. h. die Ausgabe eines Operators wird zur Eingabe des folgenden Operators. Das Ergebnis jedes Operators ist eine neue Sammlung von Dokumenten.

Daher kann das, was Sie oben zu erreichen versuchen, einfach in die folgende Pipeline umgeschrieben werden, ohne dass zuerst ein Array von Dokumenten erstellt werden muss:

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

AKTUALISIEREN

Wenn Sie die Änderungen an Ihrer Frage nachverfolgen und die folgende Aggregationspipeline ausführen, erhalten Sie das gewünschte Ergebnis:

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