【问题标题】:How to fetch document with filtered nested document using Mongo query?如何使用 Mongo 查询获取过滤嵌套文档的文档?
【发布时间】:2021-03-28 18:30:47
【问题描述】:

这是我的organization 收藏。

[{
    "_id" : ObjectId("5fd5fc1b9f117029b5233b2e"),
    "name" : "ClassA",
    "orgMembers" : [ 
        {
            "_id" : ObjectId("5fd5fc1b9f117029b5233b2f"),
            "userId" : "Ben",
        },
        {
            "_id" : ObjectId("5fd5fc1b9f117029b5233b2f"),
            "userId" : "Anton",
        }
    ],
},
{
    "_id" : ObjectId("5fd5fc1b9f117029b5233b2e"),
    "name" : "ClassA",
    "orgMembers" : [ 
        {
            "_id" : ObjectId("5fd5fc1b9f117029b5233b2f"),
            "userId" : "Ben",
        }
    ],
}]

每个文档都有_idnameorgMembers等属性,它们代表文档信息。 而orgMembers 是属于组织的成员(_id, userId) 的数组。

在此collection 中,我想获取包含 orgMember 和 AntonuserId 的组织,以及获取的组织文档的 orgMembers 应仅包含 Anton 作为 orgMember。

预期结果也是这样

[{
    "_id" : ObjectId("5fd5fc1b9f117029b5233b2e"),
    "name" : "ClassA",
    "orgMembers" : [
        {
            "_id" : ObjectId("5fd5fc1b9f117029b5233b2f"),
            "userId" : "Anton",
        }
    ],
}]

这里ClassA组织有两个orgMember,但需要过滤匹配userId

我试过了

documentModel.find({ 'orgMembers.userId': 'Anton' })

但是在这个查询中,我得到这样的结果。

[{
    "_id" : ObjectId("5fd5fc1b9f117029b5233b2e"),
    "name" : "ClassA",
    "orgMembers" : [ 
        // should be omitted 
        {
            "_id" : ObjectId("5fd5fc1b9f117029b5233b2f"),
            "userId" : "Ben",
        },

        // should be contained
        {
            "_id" : ObjectId("5fd5fc1b9f117029b5233b2f"),
            "userId" : "Anton",
        }
    ],
}]

对于预期的结果,应该省略带有userId: Ben 的orgMember。

如何使用 mongo 查询获得预期结果?

【问题讨论】:

    标签: node.js database mongodb mongoose mongodb-query


    【解决方案1】:

    不确定我是否完全满足您的要求:

    如果可行就试试这个

    db.collection.find({
      "orgMembers.userId": {
        $regex: "Anton",
        $options: "i"
      }
    },
    {
      name: 1,
      "orgMembers.$": 1
    })
    

    这是仅返回您在orgMembers 中寻找的userId。如果有更多orgmembers,它们将不会成为输出的一部分

    【讨论】:

      【解决方案2】:

      我相信这对你有用

      db.collection.find({
        "orgMembers.userId": "Anton"
      },
      {
        orgMembers: {
          "$elemMatch": {
            userId: "Anton"
          }
        }
      })
      
      

      【讨论】:

      • 感谢您的回答。我试过你的解决方案。 mongoplayground.net/p/0Kwiku7o_Av 但我没有得到预期的结果。
      • @AdelinIonut 您的问题有点令人困惑。我现在已经更新了查询。
      • 嗨@KevinLi,你的查询对我来说不起作用。如果我向 orgMember 添加另一个属性,例如 { 'userId': 'Anton', 'gender': 'man' },它应该获取所有属性,但在您的查询中,它只获取 { 'userId': 'Anton' }。同样,我需要获取该organization 的所有其他属性,但结果不包括organization 的其他属性。你能再看看mongoplayground吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-17
      • 2018-05-10
      • 1970-01-01
      • 2022-07-16
      • 1970-01-01
      • 1970-01-01
      • 2018-03-09
      相关资源
      最近更新 更多