sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Puedo solicitar cada consulta agregada en MongoDB?

No puede hacer eso con la canalización de agregación. Debe comprender que la agregación de MongoDB es una serie de operadores especiales aplicados a una colección. Cuando ejecuta una canalización de agregación, MongoDB canaliza los operadores entre sí, es decir, la salida de un operador se convierte en la entrada del siguiente operador. El resultado de cada operador es una nueva colección de documentos.

Por lo tanto, lo que está tratando de lograr en lo anterior se puede reescribir simplemente como la siguiente canalización sin la necesidad de crear primero una matriz de documentos:

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

ACTUALIZAR

Haga un seguimiento de los cambios en su pregunta, ejecutando la siguiente canalización de agregación le dará el resultado deseado:

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