query array mongodb mongodb-query nosql

array - Consulta de matriz anidada MongoDB



mongodb query object in array (3)

Después de ejecutar algunas consultas, llegué a la conclusión de que $ in no funciona para una matriz de matrices .

Puede usar $elemMatch en $elemMatch lugar y funcionará, pero es frustrante que la documentación de MongoDB no lo advierta.

Creé este documento:

{ "_id": "51cb12857124a215940cf2d4", "level1": [ [ "item00", "item01" ], [ "item10", "item11" ] ], "items": [ "item20", "item21" ] }

Tenga en cuenta que el campo "elementos" es una matriz de cadenas y esta consulta funciona perfectamente:

db.nested.findOne({"items":{"$in":["item20"]} })

Ahora, "level1.0" también es una matriz de cadenas, la única diferencia es que está dentro de otra matriz. Esta consulta debería funcionar, pero no es:

db.nested.findOne({"level1.0":{"$in":["item00"]} })

La única forma de obtener el resultado es usando $ elemMatch:

db.nested.findOne({"level1":{"$elemMatch":{"$in":[''item00'']}} })

Entonces, $elemMatch resuelve el problema, pero la solución real es actualizar la documentación de MongoDB a los estados que $in no funciona para las matrices de matrices. Quizás debas enviar una solicitud a 10gen.

He pedido esto como un comentario sobre another pregunta, y también he publicado una question sobre mongodb-usuario. No hay respuestas hasta el momento, así que estoy recurriendo a hacer una pregunta por separado.

La documentation dice:

Si el campo contiene una matriz, el operador $ in selecciona los documentos cuyo campo contiene una matriz que contiene al menos un elemento que coincide con un valor en la matriz especificada (por ejemplo, etc.)

Estoy usando:

mongod --version: db version v2.2.2, pdfile version 4.5 Thu May 30 12:19:12 git version: d1b43b61a5308c4ad0679d34b262c5af9d664267 mongo --version: MongoDB shell version: 2.0.4

En shell MongoDB:

db.nested.insert({''level1'': {''level2'': [[''item00'', ''item01''], [''item10'', ''item11'']]}})

Aquí hay una lista de consultas que deberían funcionar de acuerdo con la documentación y los resultados que producen:

¿Por qué esto no funciona?

> db.nested.findOne({''level1.level2.0'': ''item00''}) null

¿Por qué necesito el $ todo?

> db.nested.findOne({''level1.level2.0'': {''$all'': [''item00'']}}) { "_id" : ObjectId("51a7a4c0909dfd8872f52ed7"), "level1" : { "level2" : [ [ "item00", "item01" ], [ "item10", "item11" ] ] } }

Al menos uno de los siguientes debería funcionar, ¿verdad?

> db.nested.findOne({''level1.level2.0'': {''$in'': [''item00'']}}) null > db.nested.findOne({''level1.level2'': {''$in'': [''item00'']}}) null

¿Algunas ideas? Estamos considerando abandonar MongoDB si la sintaxis de la consulta no funciona como se anuncia.

¡Gracias!


Respuesta corta: $ in es para un campo de valor único y $ all es para matrices.

Primero, db.nested.findOne({''level1.level2.0'': ''item00''}) no funciona porque level1.level2.0 contiene una matriz y usted está tratando de compararla con un solo valor.

Ahora, db.nested.findOne({''level1.level2.0'': {''$in'': [''item00'']}}) tampoco funciona por un motivo similar. $ in es para comparar un campo con un único valor (tiene una matriz) con varios valores en una matriz (especificada en la consulta). $ in está diciendo: dame los documentos que tienen este campo cuyo valor está incluido en esta matriz.

$ all está funcionando porque está diciendo: dame los documentos que tienen este campo con varios valores y todos los valores de esta matriz (en la consulta) están incluidos en ese campo. (editado)

Puede ser difícil de conseguir, pero mira lo que dice la documentación para cada uno:

$ all selecciona los documentos donde el campo contiene una matriz y contiene todos los elementos (eg <value>, <value1>, etc. ) en la matriz.

$ in selecciona los documentos donde el valor del campo es igual a cualquier valor en la matriz especificada ( eg <value1>, <value2>, etc. )

Espero eso ayude