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
Use elemMatch
anidado para buscar niveles anidados dentro de las matrices.