【问题标题】:MongoDb subdocument query follows OR conditions?MongoDb 子文档查询遵循 OR 条件?
【发布时间】:2014-03-05 16:10:50
【问题描述】:

考虑集合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'
               }
             )

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    尝试使用$elemMatch

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

    【讨论】:

    • @Echo 这就是重点。 objectId 来自数组中的另一个条目
    • @NeilLunn 为什么你删除了你自己的问题?有什么问题吗?
    • @Echo 因为我误读了这个问题。标准来自数组中的两个不同文档。该查询旨在返回所有内容。
    • @Pierre 非常感谢。他们应该清楚地说明文档中的差异。
    • 不客气,我自己用过这一次;)
    【解决方案2】:

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

    您的查询不仅要返回同一索引中people 数组中具有user_id:5316c81cb338e1a08a386366role:admin 的文档,而且还返回具有这两者但不在同一索引中的文档people 数组的相同索引。

    如果您对数组进行普通查询,它会查看整个数组并检查数组中是否存在两个条件。因此,为了返回 bbc 文档,您只需要提供一个角色-用户 ID 对,该对存在于人员数组中 - 索引独立。如果您想获得所需的行为,那么您应该使用@Pierre 的答案$elemMatch。阅读documentation

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

    【讨论】:

      猜你喜欢
      • 2023-04-04
      • 2022-01-20
      • 1970-01-01
      • 2017-01-04
      • 1970-01-01
      • 1970-01-01
      • 2018-06-06
      • 2016-09-29
      • 1970-01-01
      相关资源
      最近更新 更多