2012-09-27 13 views
36

Say, tengo un documento como este ..Consulta de una matriz de matrices en MongoDB

"ID" : "fruit1", 
"Keys" : [["apple", "carrot", "banana"]] 

¿Cómo de consultas para teclado = "zanahoria". Ninguna de las siguientes sintaxis funciona.

db.myColl.results.find({ "Keys" : "carrot" }); 
db.myColl.results.find({ "Keys" : [["carrot"]] }); 

Siguiendo funciona, pero no es útil.

db.myColl.results.find({ "Keys" : [["apple", "carrot", "banana]]}); 

Cualquier puntero a esta consulta será útil. Gracias.

+1

Creo que su mejor opción es cambiar su esquema. Los documentos con matrices de matrices no son bien compatibles con Mongo. – JohnnyHK

+0

@JohnnyHK, es bastante posible en mongo consultar matrices anidadas. mira mi respuesta – RameshVel

Respuesta

102

Interesante pregunta, Esto va a hacer el truco

db.multiArr.find({'Keys':{$elemMatch:{$elemMatch:{$in:['carrot']}}}}) 

$elemMatch utilizado para comprobar si un elemento de una matriz coincide con la expresión de coincidencia especificada. manera anidada $elemMatch será profundizar en las matrices anidadas

Los datos de prueba

db.multiArr.insert({"ID" : "fruit1","Keys" : [["apple", "carrot", "banana"]]}) 
db.multiArr.insert({"ID" : "fruit2","Keys" : [["apple", "orange", "banana"]]}) 


db.multiArr.find({'Keys':{$elemMatch:{$elemMatch:{$in:['carrot']}}}}) 
{ "_id" : ObjectId("506555212aeb79b5f7374cbf"), "ID" : "fruit1", "Keys" : [ [ "apple", "carrot", "banana" ] ] } 

db.multiArr.find({'Keys':{$elemMatch:{$elemMatch:{$in:['banana']}}}}) 

{ "_id" : ObjectId("506555212aeb79b5f7374cbf"), "ID" : "fruit1", "Keys" : [ [ "apple", "carrot", "banana" ] ] } 
{ "_id" : ObjectId("5065587e2aeb79b5f7374cc0"), "ID" : "fruit2", "Keys" : [ [ "apple", "orange", "banana" ] ] } 
+1

Obtienes 100 puntos por ello. Gran respuesta :) – rajibdotnet

+0

@rajibdotnet, me alegro de que me ayudó :) – RameshVel

+0

Corrígeme si me equivoco, pero no $ elemMatch solo devuelve el primer resultado, lo que hace que tu ejemplo "banana" sea incorrecto? –

0

si usted quiere encontrar variedad de datos primera posición, utilizar 0 como índice de referencia para obtener los datos de matriz anidada.

db.getCollection('routes').find({"routeId" : 12,'routes._id':ObjectId("598da27a713f3e6acd72287f"),'routes.0.stops.0.orders.0._id':ObjectId("598da27a713f3e6acd722887")}) 
Cuestiones relacionadas