ventajas que español desventajas caracteristicas mongodb aggregation-framework

que - mongodb español



MongoDB agregado por campo existe (3)

El operador $exists es un operador de "consulta", por lo que se utiliza básicamente para "filtrar" los resultados en lugar de identificar una condición lógica.

Como operador "lógico", el marco de agregación admite el operador $ifNull . Esto devuelve el valor del campo donde existe o el valor suministrado alternativo donde no lo hace o de lo contrario se evalúa como null

db.test.aggregate([ { "$group": { "_id": { "$ifNull": [ "$field", false ] }, "count": { "$sum": 1 } }} ])

Pero, por supuesto, incluso esa no es una comparación "verdadera / falsa", por lo que, a menos que realmente desee devolver el valor real del campo donde está presente, probablemente esté mejor con una declaración de $cond muy parecida a la que tiene:

db.test.aggregate([ { "$group": { "_id": { "$cond": [{ "$eq": [ "$field", null ] }, true, false ] }, "count": { "$sum": 1 } }} ])

Donde $ifNull puede ser muy útil es en la sustitución de campos de arreglos no existentes que de lo contrario causarían un error al usar $unwind . Luego puede hacer algo como devolver un solo elemento o una matriz vacía para que esto no cause problemas en el resto de su proceso de canalización.

Me cuesta creer que esta pregunta no haya sido formulada y respondida en alguna parte, pero no puedo encontrar ningún rastro de ella.

Tengo una consulta de agregación de MongoDB que debe agruparse por un valor booleano: la existencia de otro campo.

Por ejemplo, comencemos con esta colección:

> db.test.find() { "_id" : ObjectId("53fbede62827b89e4f86c12e"), "field" : ObjectId("53fbede62827b89e4f86c12d"), "name" : "Erik" } { "_id" : ObjectId("53fbee002827b89e4f86c12f"), "name" : "Erik" } { "_id" : ObjectId("53fbee092827b89e4f86c131"), "field" : ObjectId("53fbee092827b89e4f86c130"), "name" : "John" } { "_id" : ObjectId("53fbee122827b89e4f86c132"), "name" : "Ben" }

2 documentos tienen "campo", y 2 no. Tenga en cuenta que cada valor de "campo" puede ser diferente; solo queremos agruparnos en su existencia (o la no nulidad también funciona para mí, no tengo ningún valor nulo almacenado).

He intentado usar $ project, pero $ existe no existe allí, y $ cond y $ ifNull no me han ayudado. El campo siempre parece existir, incluso cuando no:

> db.test.aggregate( {$project:{fieldExists:{$cond:[{$eq:["$field", null]}, false, true]}}}, {$group:{_id:"$fieldExists", count:{$sum:1}}} ) { "_id" : true, "count" : 4 }

Yo esperaría que el siguiente agregado mucho más simple funcione, pero por alguna razón, $ existe no es compatible de esta manera:

> db.test.aggregate({$group:{_id:{$exists:"$field"}, count:{$sum:1}}}) assert: command failed: { "errmsg" : "exception: invalid operator ''$exists''", "code" : 15999, "ok" : 0 } : aggregate failed Error: command failed: { "errmsg" : "exception: invalid operator ''$exists''", "code" : 15999, "ok" : 0 } : aggregate failed at Error (<anonymous>) at doassert (src/mongo/shell/assert.js:11:14) at Function.assert.commandWorked (src/mongo/shell/assert.js:244:5) at DBCollection.aggregate (src/mongo/shell/collection.js:1149:12) at (shell):1:9 2014-08-25T19:19:42.344-0700 Error: command failed: { "errmsg" : "exception: invalid operator ''$exists''", "code" : 15999, "ok" : 0 } : aggregate failed at src/mongo/shell/assert.js:13

¿Alguien sabe cómo obtener el resultado deseado de una colección como esta?

Resultado Esperado:

{ "_id" : true, "count" : 2 } { "_id" : false, "count" : 2 }


Lo resolví comprobando lo indefinido.

$ne : [$var_to_check, undefined]

o

$ne: [ { $type : "$var_to_check"}, ''missing''] }

Esto devuelve verdadero si la var está definida