Quiero $project si existe un campo, pero no su valor, usando la consulta aggregate del model mongoose . Si fuera posible usar $exists en $cond , se vería así:
$project: { b: { $cond: { if : {$exists: ['$b', true]}, then : true, else : false } } } Pero tengo que usar una expresión boolean en el operador $cond . En el shell de MongoDB, puedo hacer algo similar con:
{$eq: ['$b', undefined]} y produce los resultados esperados, pero con el aggregate del modelo mongoose por alguna razón, siempre da como resultado true .
por ejemplo, si tengo los siguientes documentos:
{ "a" : 1, "b" : 2 }, { "a" : 1 }Necesito los siguientes resultados:
{ "b": true }, { "b": false } ¿Cómo puedo hacer algo así con la mongoose ?
$exists no es compatible con la consulta aggregate de MongoDB . Entonces, en una consulta aggregate en lugar de $exists puede usar $ifNull .
sintaxis:
{ $ifNull: [ <expression>, <replacement-expression-if-null> ] }Actualizado:
para obtener el valor b como true o false puede probar esta consulta
db.test.aggregate([ { $project: { b: { $cond: [ {$ifNull: ['$b', false]}, // if true, // then false // else ] } } } ])Explicación:
b = $cond: [ 'if condition satisfied', 'then true', 'else false' ]; where condition = {$ifNull: ['$b', false]} Aquí, si $b no existe, entonces condition = false de lo contrario condition = true .
entonces, si condition = true , devuelve el resultado que significa b = true
si condition = false entonces devuelve resultado de lo contrario significa b = false
Puede usar dos declaraciones $project para este caso y hacer uso del operador $ifNull (simplemente no funcionará cuando some_field se establezca como false , en cuyo caso puede cambiar el false interno a algo más adecuado)
[ { $project: { test: { $ifNull: [ '$some_field', false ] } } }, { $project: { test: { $cond: { if : {$eq: ['$test', false]}, then : false, else : true } } } } ])