Tengo una función que debería devolver un recuento de usuarios creados en un período determinado y agrupados por invitados y no invitados. En el operador $cond , necesito comparar si el campo tkbSponsor no es null y no es igual a example@example.com . Si esta condición resulta verdadera, entonces se invitó al usuario. De lo contrario, no fue invitado.
var countByPeriod = function(req,res) { var initialDate = req.body.initialDate; var finalDate = req.body.finalDate; User.aggregate([ { "$match": { "timeStamp": { "$gte": new Date(initialDate), "$lt": new Date(finalDate) } } }, { "$group": { "_id": null, "total": { "$sum": 1 }, "invited": { "$sum": { "$cond": [ { "tkbSponsor": { "$nin": ["example@example.com",null] } }, 1, 0 ] } } } } ], (err,result) => { if (!err) { if (result.length) res.send(result[0]); else res.send({"total": 0,"invited":0}); } else { res.sendStatus(500); console.log(err); } }); };Por cierto, esta función me está dando un error cuando se ejecuta:
{ [MongoError: invalid operator '$nin'] name: 'MongoError', message: 'invalid operator \'$nin\'', ok: 0, errmsg: 'invalid operator \'$nin\'', code: 15999 } Solo una observación. Solía usar el operador $cond como se muestra a continuación, porque no necesitaba comparar con null :
"$cond": [ { "$ne": ["$tkbSponsor", "example@example.com"] }, 1, 0 ] Y funciona. Sin embargo, ahora también tengo que comparar si el tkbSponsor no es nulo y usando $nin , me está dando ese error.
Cambie eso para usar $and junto con $ifNull se fusionan como:
{ "$cond": [ { "$and": [ { "$ne": ["$tkbSponsor", "example@example.com"] }, { "$ne": [ { "$ifNull": [ "$tkbSponsor", null ] }, null ] } ] }, 1, 0 ] } o usando $or como
{ "$cond": [ { "$or": [ { "$eq": ["$tkbSponsor", "example@example.com"] }, { "$eq": [ { "$ifNull": [ "$tkbSponsor", null ] }, null ] } ] }, 0, 1 ] } La presencia del operador $ifNull es actuar como un operador $exists al reemplazar los campos "no existentes" o nulos con un valor null para la evaluación.
Ejecutar esto debería arrojar los resultados correctos ya que la revisión anterior solo evaluaba documentos donde exists el campo tkbSponsor Y tiene un valor null o "example@example.com".
Con $ifNull , los campos "no existentes" también se evalúan cuando el operador les da el valor nulo.