Mongoose 按子文档查找所有文档并过滤掉不匹配的子文档

Mongoose Find all Documents by subdocument and filter out subdocs that dont match

我正在尝试查询包含特定用户数据的集合中的所有文档,而不 returning 所有子文档(有大量子文档)

示例文档

[
    {
        "id": 1,
        "title": "Document 1",
        "users": [
            { "id": "a", "name": "User 1" },
            { "id": "b", "name": "User 1" },
        ]
    },
    {
        "id": 2,
        "title": "Document 2",
        "users": [
            { "id": "b", "name": "User 1" },
        ]
    },
    {
        "id": 3,
        "title": "Document 3",
        "users": [
            { "id": "a", "name": "User 1" },
            { "id": "b", "name": "User 1" },
            { "id": "c", "name": "User 1" },
        ]
    }
]

这里我们有 3 个文档,其中 2 个使用 ID A,查询用户 A 存在的所有文档我正在做:

collection.findManyByQuery({
    users: {
        $elemMatch: {
            id: 'a'
        }
    }
})

这个 returns me documents with id 1 and 3 which is correct.但是我正在尝试 return 用户数组中只有用户 A 对象的文档,所以我的结果看起来像这样

[
    {
        "id": 1,
        "title": "Document 1",
        "users": [
            { "id": "a", "name": "User 1" },
        ]
    },
    {
        "id": 3,
        "title": "Document 3",
        "users": [
            { "id": "a", "name": "User 1" },
        ]
    }
]

我尝试了 $unwind: 'users' 和几个过滤器,但没有得到想要的结果。

使用projection阶段。

根据文档:

The projection parameter determines which fields are returned in the matching documents

所以使用 users.$: 1 你告诉 mongo:“Return 来自符合标准的用户的价值”。在这种情况下,标准是 id: "a".

db.collection.find({
  users: {
    $elemMatch: {
      id: "a"
    }
  }
},
{
  "users.$": 1
})

示例here

您也可以像 this example

那样在查找查询中使用 users.id

也许是一个更干净的查询,只有两行:

db.collection.find({
  "users.id": "a"
},
{
  "users.$": 1
})

编辑:

要向输出添加更多值(如 titleid),您必须添加到投影阶段。默认情况下仅投影 return _id1true.

的值

勾选this example