2015-04-02 183 views
0

与给定合集“富”,我们有场“酒吧”,看起来像这样:复杂蒙戈阵列查询

"bar": [{uid:1, mid: 10}, {uid:1, mid: 12}, {uid:2, mid: 14}, {uid:2, mid: 15}, {uid:2, mid: 18}] 

我怎样才能使一个查询,以便对场“酒吧”获取所有“的Foo”那下面的条件满足:“UID”= 2,[14,18]

+0

你可以放松了。那么,做出这样的查询更容易。你想对所有集合执行这个查询? – 2015-04-02 16:02:24

+0

不是$ unwind仅用于聚合框架吗?不,我只想查询一个集合。 – dakt 2015-04-02 16:33:34

+0

你是对的,它用于聚合。我以复杂的方式思考,可以轻松完成。我的坏... – 2015-04-02 20:00:39

回答

2

“中” 有两种方法来解释你的病情

所有 “FOOS” 场上 “栏” 即满足以下条件:“uid”= 2 a第二“中” [14,18]

你的意思是“发现在foo收集这样所有的文档存在bar阵列满足e.uid = 2e.mid的元素e是[14,18元素]“?如果是这样,MongoDB的查询,写在蒙戈外壳,是

db.foo.find({ "bar" : { "$elemMatch" : { "uid" : 2, "mid" : { "$in" : [14, 18] } } } }) 

你的意思是“发现在foo收集这样所有的文档,有2 bar.mid值的bar.uid值[14,18] “?如果是这样,MongoDB的查询,写在蒙戈外壳,是

db.foo.find({ "bar.uid" : 2, "bar.mid" : { "$in" : [14, 18] } }) 

下面的例子演示了这些查询之间的区别:

> db.foo.drop() 
> db.foo.insert({ "_id" : 0, "bar" : [{ "uid" : 2, "mid" : 14 }] }) 
> db.foo.insert({ "_id" : 1, "bar" : [{ "uid" : 2, "mid" : 99 }, { "uid" : 3, "mid" : 18 }] }) 

// first version 
> db.foo.find({ "bar" : { "$elemMatch" : { "uid" : 2, "mid" : { "$in" : [14, 18] } } } }) 
{ "_id" : 0, "bar" : [{ "uid" : 2, "mid" : 14 }] } 

// second version 
> db.foo.find({ "bar.uid" : 2, "bar.mid" : { "$in" : [14, 18] } }) 
{ "_id" : 0, "bar" : [{ "uid" : 2, "mid" : 14 }] } 
{ "_id" : 1, "bar" : [{ "uid" : 2, "mid" : 99 }, { "uid" : 3, "mid" : 18 }] } 
+0

嗨!足够近。然而,“bar.mid”必须有来自给定表达式“$ in”的所有成员:[14,18]。我尝试使用“$ all”操作符,但没有任何反应。 – dakt 2015-04-03 07:46:16