复杂的mongo数组查询

时间:2015-04-02 15:41:04

标签: mongodb

给定收集" foo",我们有字段" bar"看起来像这样:

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

如何进行查询以获取所有" foos"在球场" bar"满足以下条件:" uid" = 2和" mid"在[14,18]

1 个答案:

答案 0 :(得分:2)

有两种解释条件的方法

  

满足以下条件的字段“bar”上的所有“foos”:“uid”= 2和[14,18]中的“mid”

您的意思是“查找foo集合中的所有文档,以使e数组符合bare.uid = 2的元素e.mid为[14,18]的一个元素“?如果是这样,用mongo shell编写的MongoDB查询是

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

您的意思是“查找foo集合中的所有文档,以便[14,18]中的bar.uid值为2且bar.mid”?如果是这样,用mongo shell编写的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 }] }