2012-09-27 56 views
36

说,一个数组,我有这样一个文件..查询阵列的MongoDB中

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

如何查询键=“胡萝卜”。下列语法都不起作用。

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

虽然以下工作,但没有帮助。

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

任何指向此查询的指针都会有帮助。谢谢。

+1

我认为你最好的选择是改变你的模式。包含数组数组的文档不被Mongo很好的支持。 – JohnnyHK

+0

@JohnnyHK,它很可能在mongo中查询嵌套数组。看看我的回答 – RameshVel

回答

102

有趣的问题,这将做用于检查在一个阵列中的元素的指定匹配表达式匹配的特技

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

$elemMatch。如果你想找到的第一位置数据的阵列,使用0作为参考指标嵌套阵列获取数据 所以嵌套$elemMatch将进入更深的嵌套阵列

测试数据

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

你会得到100分。很好的回答:) – rajibdotnet

+0

@rajibdotnet,很高兴它帮助:) – RameshVel

+0

纠正我,如果我错了,但不$ elemMatch只返回第一个结果,呈现您的“香蕉”示例不正确? –

0

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