Mongodb 嵌套文档的 $ 运算符
Mongodb $ operator for nested documents
有wfs合集如下:
{
_id:'1',
transitions:
[
{
_id:'11',
checkLists:
[
{
_id:'111',
name:'One',
},
{
_id:'112',
name:'Two',
}
]
}
]
}
我要获取_id:'111'的子子文档
我尝试了以下代码但没有按预期工作,它 returns 所有二级嵌套文档都不是正确的对象
db.wfs.findOne(
{ 'transitions.checkLists._id': ObjectId('111') },
{ 'transitions.checkLists._id': 1 },
);
结果:
{
transitions: [
{
"checkLists": [
{
"name": "One",
"_id": "111"
},
{
"name": "Two",
"_id": "112"
}
]
}
]
}
预期结果:
[
{
"checkLists": [
{
"name": "One",
"_id": "111"
}
]
}
]
感谢任何提示或解决方案
您可以使用:
db.collection.aggregate([
{
$match: {"transitions.checkLists._id": "111"}
},
{
$project: {
transitions: {
$reduce: {
"input": "$transitions",
initialValue: [],
in: {$concatArrays: ["$$value", "$$this.checkLists" ]}
}
}
}
},
{
$project: {
_id: 0,
checkLists: {
$filter: {
input: "$transitions",
as: "item",
cond: {$eq: ["$$item._id", "111" ]}
}
}
}
}
])
正如您在 this playground example 上看到的那样。
$reduce
用于“扁平化”你的列表,$filter
用于只保留你想要的部分。
这是基于 一个基本相似但稍微复杂一点的问题。这里的解决方案只是一个简单的版本。
有wfs合集如下:
{
_id:'1',
transitions:
[
{
_id:'11',
checkLists:
[
{
_id:'111',
name:'One',
},
{
_id:'112',
name:'Two',
}
]
}
]
}
我要获取_id:'111'的子子文档 我尝试了以下代码但没有按预期工作,它 returns 所有二级嵌套文档都不是正确的对象
db.wfs.findOne(
{ 'transitions.checkLists._id': ObjectId('111') },
{ 'transitions.checkLists._id': 1 },
);
结果:
{
transitions: [
{
"checkLists": [
{
"name": "One",
"_id": "111"
},
{
"name": "Two",
"_id": "112"
}
]
}
]
}
预期结果:
[
{
"checkLists": [
{
"name": "One",
"_id": "111"
}
]
}
]
感谢任何提示或解决方案
您可以使用:
db.collection.aggregate([
{
$match: {"transitions.checkLists._id": "111"}
},
{
$project: {
transitions: {
$reduce: {
"input": "$transitions",
initialValue: [],
in: {$concatArrays: ["$$value", "$$this.checkLists" ]}
}
}
}
},
{
$project: {
_id: 0,
checkLists: {
$filter: {
input: "$transitions",
as: "item",
cond: {$eq: ["$$item._id", "111" ]}
}
}
}
}
])
正如您在 this playground example 上看到的那样。
$reduce
用于“扁平化”你的列表,$filter
用于只保留你想要的部分。
这是基于