MongoDb子文档查询遵循OR条件?

时间:2014-03-05 07:00:29

标签: mongodb

考虑集合orgs

db.orgs.save({"name":"bbc","people":[{"user_id":new ObjectId(),"role":"admin"},{"user_id":new ObjectId(),"role":"user"}]})

是:

db.orgs.find().pretty()

以下结构:

{
    "_id" : ObjectId("5316c81cb338e1a08a386367"),
    "name" : "bbc",
    "people" : [
        {
            "user_id" : ObjectId("5316c81cb338e1a08a386365"),
            "role" : "admin"
        },
        {
            "user_id" : ObjectId("5316c81cb338e1a08a386366"),
            "role" : "user"
        }
    ]
}

因此,如果我们查询user_id:5316c81cb338e1a08a386366role:admin

db.orgs.find({
                 "people.user_id":ObjectId("5316c81cb338e1a08a386366"),
                 "people.role":"admin"
             }).pretty()

它会找到该文档(尽管user_id 5316c81cb338e1a08a386366具有角色user)。

我错过了什么吗?

因为documentation example说:

  

以下示例使用点表示法来查询文档   memos字段的值是一个至少有一个的数组   包含等于“准时”的字段备忘录的子文档和   字段等于'运费':

      db.inventory.find(
               {
                 'memos.memo': 'on time',
                 'memos.by': 'shipping'
               }
             )

2 个答案:

答案 0 :(得分:2)

尝试使用$elemMatch

db.orgs.find({ people: { $elemMatch: { user_id: ObjectId("5316c81cb338e1a08a386366"), role: 'admin' } } })

答案 1 :(得分:1)

只是一些解释:您正在将普通查询与数组查询混合在一起。

您的查询不仅将返回同一索引中user_id:5316c81cb338e1a08a386366数组中role:adminpeople的文档,还会返回包含两者都有,但不在people数组的相同索引中。

如果对数组执行常规查询,则会查看整个数组,并检查数组中是否存在这两个条件。因此,为了返回bbc文档,您需要提供的是一个role-user_id对,它存在于people数组中 - 独立索引。如果你想拥有所需的行为,那么你应该使用@Pierre的答案,$elemMatch。阅读documentation

关于您提供的文档示例,它确实假设memos不是数组。如果它是一个数组,则相同的条件将成立。