MongoDB 根据文档值而不是显式条件匹配数组
MongoDB match array based on document value rather than explicit condition
假设我有以下文档结构:
{
"A": {
"_id": "ID0"
},
"B": [
{
"_id": "ID0",
"field": "X"
},
{
"_id": "ID1",
"field": "Y"
}
]
}
我想投影 B
与 A
中的 _id
匹配。最终结果将是:
{
"B": [
{
"_id": "ID0",
"field": "X"
}
]
}
我尝试了以下方法,但显然我做错了什么。是否可以根据提交的文件而不是明确的条件进行匹配?
db.collection.aggregate([
{$match: {"B._id": "$A._id"}},
{$project: {"B": 1}}
])
您可以使用 $filter 聚合运算符来实现此目的:
db.collection.aggregate([
{
$addFields: {
"B": {
$filter: {
input: "$B",
as: "arr",
cond: {
$eq: [
"$A._id",
"$$arr._id"
]
}
}
}
}
}
])
测试一下here
假设我有以下文档结构:
{
"A": {
"_id": "ID0"
},
"B": [
{
"_id": "ID0",
"field": "X"
},
{
"_id": "ID1",
"field": "Y"
}
]
}
我想投影 B
与 A
中的 _id
匹配。最终结果将是:
{
"B": [
{
"_id": "ID0",
"field": "X"
}
]
}
我尝试了以下方法,但显然我做错了什么。是否可以根据提交的文件而不是明确的条件进行匹配?
db.collection.aggregate([
{$match: {"B._id": "$A._id"}},
{$project: {"B": 1}}
])
您可以使用 $filter 聚合运算符来实现此目的:
db.collection.aggregate([
{
$addFields: {
"B": {
$filter: {
input: "$B",
as: "arr",
cond: {
$eq: [
"$A._id",
"$$arr._id"
]
}
}
}
}
}
])
测试一下here