扩展了以下问题:MongoDB filter multi sub-documents我希望过滤文档以仅显示活动子文档:活动汽车和活动水果。
在以下文档中使用chridam的汇总管道构建,其中禁用所有fruits
{
"name":"Andre",
"fruits":[
{
"active":false,
"fruitname":"apple"
},{
"active":false,
"fruitname":"banana"
}
],
"cars":[
{
"active":false,
"carname":"ford"
},{
"active":true,
"carname":"GM"
},
]
}
使用的聚合管道:
var pipeline = [
{
"$match": {
"name": "Andre",
"fruits.active": true,
"cars.active": true
}
},
{ "$unwind": "$fruits" },
{ "$unwind": "$cars" },
{
"$match": {
"fruits.active": true,
"cars.active": true
}
},
{
"$group": {
"_id": {
"_id": "$_id",
"name": "$name"
},
"cars": { "$addToSet" : "$cars" },
"fruits": { "$addToSet" : "$fruits" }
}
},
{
"$project": {
"_id": 0,
"name": "$_id.name",
"cars": 1,
"fruits": 1
}
}
]
m_object.aggregate(pipeline)
.exec(function (err, result) {
if (err) {
console.log(err);
return;
}
console.log('result');
});
而不是
[{
"name":"Andre",
"fruits":[],
"cars":[
{
"active":true,
"carname":"GM"
},
]
}]
聚合返回
[]
答案 0 :(得分:1)
尝试以下聚合管道,它不会为非活动元素返回一个空数组,但更接近结果:
db.collection.aggregate([
{
"$match": {
"name": "Andre",
"$or": [
{ "fruits.active": true },
{ "cars.active": true }
]
}
},
{ "$unwind": "$fruits" },
{ "$unwind": "$cars" },
{
"$match": {
"$or": [
{ "fruits.active": true },
{ "cars.active": true }
]
}
},
{
"$project": {
"name": 1,
"active_cars": "$cars.active",
"active_fruits": "$fruits.active",
"cars": 1,
"fruits": 1
}
},
{
"$project": {
"name": 1,
"cars": {
"$cond": [
{ "$eq": ["$active_cars", true] },
"$cars",
{}
]
},
"fruits": {
"$cond": [
{ "$eq": ["$active_fruits", true] },
"$fruits",
{}
]
}
}
},
{
"$group": {
"_id": {
"_id": "$_id",
"name": "$name"
},
"cars": { "$addToSet" : "$cars" },
"fruits": { "$addToSet" : "$fruits" }
}
},
{
"$project": {
"_id": 0,
"name": "$_id.name",
"cars": 1,
"fruits": 1
}
}
])
<强>输出强>
/* 1 */
{
"result" : [
{
"cars" : [
{
"active" : true,
"carname" : "GM"
}
],
"fruits" : [{}],
"name" : "Andre"
}
],
"ok" : 1
}
答案 1 :(得分:0)
让我们看一下管道中的第一个操作,即查询条件:
"$match": {
"name": "Andre",
"fruits.active": true,
"cars.active": true
}
英文:&#34;找到name = Andre
所有文件,其中至少有一个活跃的水果和至少有一辆活跃的汽车。&#34;
因此,您明确地请求不在没有活动水果和汽车的情况下获得任何结果,因此结果为空。