2012-09-27 63 views
36

Nói, tôi có một tài liệu như thế này ..Truy vấn một mảng của mảng trong MongoDB

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

Làm thế nào để truy vấn cho phím = "củ cà rốt". Không cú pháp nào sau đây hoạt động.

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

Làm việc theo mặc dù nhưng không hữu ích.

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

Bất kỳ con trỏ nào đến truy vấn này đều hữu ích. Cảm ơn.

+1

Tôi nghĩ đặt cược tốt nhất của bạn là thay đổi giản đồ. Tài liệu với mảng mảng không được hỗ trợ tốt bởi Mongo. – JohnnyHK

+0

@JohnnyHK, rất có thể trong mongo để truy vấn mảng lồng nhau. hãy xem câu trả lời của tôi – RameshVel

Trả lời

102

Thú vị câu hỏi, này sẽ làm các trick

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

$elemMatch sử dụng để kiểm tra xem một phần tử trong một mảng phù hợp với biểu hiện phù hợp với quy định. để lồng nhau $elemMatch sẽ đi sâu hơn vào mảng lồng

dữ liệu thử nghiệm

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

Bạn nhận được 100 điểm cho nó. Câu trả lời tuyệt vời :) – rajibdotnet

+0

@rajibdotnet, vui vì nó đã giúp :) – RameshVel

+0

Đúng nếu tôi sai, nhưng không phải $ elemMatch chỉ trả lại kết quả đầu tiên, hiển thị ví dụ "chuối" của bạn không chính xác? –

0

nếu bạn muốn tìm mảng dữ liệu vị trí đầu tiên, sử dụng 0 như chỉ số tài liệu tham khảo để có được dữ liệu trong mảng lồng nhau.

db.getCollection('routes').find({"routeId" : 12,'routes._id':ObjectId("598da27a713f3e6acd72287f"),'routes.0.stops.0.orders.0._id':ObjectId("598da27a713f3e6acd722887")}) 
Các vấn đề liên quan