2012-09-27 14 views
36

powiedzmy Mam dokument tak ..Zapytania tablicy tablic w MongoDB

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

Jak kwerendy dla Keys = „marchewki”. Nie działa żadna z poniższych składni.

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

Po pracy jednak, ale nie jest pomocna.

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

Pomocny będzie dowolny wskaźnik do tego zapytania. Dzięki.

+1

Myślę, że najlepiej jest zmienić swój schemat. Dokumenty z tablicami tablic nie są dobrze obsługiwane przez Mongo. – JohnnyHK

+0

@JohnnyHK, jest całkiem możliwe w Mongo do kwerend zagnieżdżonych tablic. sprawdź moją odpowiedź – RameshVel

Odpowiedz

102

Ciekawe pytanie, będzie to rade

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

$elemMatch wykorzystywane do sprawdzenia, czy element w tablicy pasuje do określonego wyrażenia mecz. tak zagnieżdżone $elemMatch pójdzie w głąb zagnieżdżonych tablic

danych testowych

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

Otrzymujesz 100 znaków za to. Świetna odpowiedź :) – rajibdotnet

+0

@rajibdotnet, cieszę się, że pomogło :) – RameshVel

+0

Popraw mnie, jeśli się mylę, ale czy $ elemMatch nie zwróci pierwszego wyniku, powodując niepoprawny przykład "banana"? –

0

jeśli chcesz znaleźć tablicę danych pierwszej pozycji, użyj 0 jako wskaźnika referencyjnego w celu uzyskania danych w zagnieżdżonych tablicy.

db.getCollection('routes').find({"routeId" : 12,'routes._id':ObjectId("598da27a713f3e6acd72287f"),'routes.0.stops.0.orders.0._id':ObjectId("598da27a713f3e6acd722887")}) 
Powiązane problemy