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
})
编辑:
要向输出添加更多值(如 title
或 id
),您必须添加到投影阶段。默认情况下仅投影 return _id
和 1
或 true
.
的值
我正在尝试查询包含特定用户数据的集合中的所有文档,而不 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
})
编辑:
要向输出添加更多值(如 title
或 id
),您必须添加到投影阶段。默认情况下仅投影 return _id
和 1
或 true
.