mongoDB聚合返回空

扩展这个下面的问题: MongoDB筛选多个子文档 ,我想过滤一个文档,只显示活动的子文档:活动汽车和活动水果。

在以下文档中使用由chridam构build的聚合pipe道,其中所有fruits都被禁用

 { "name":"Andre", "fruits":[ { "active":false, "fruitname":"apple" },{ "active":false, "fruitname":"banana" } ], "cars":[ { "active":false, "carname":"ford" },{ "active":true, "carname":"GM" }, ] } 

使用的聚合pipe道:

 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" }, ] }] 

聚合返回

 [] 

尝试下面的聚合pipe道,它不会为非活动元素返回一个空数组,但更接近结果:

 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 } 

我们来看pipe道中的第一个操作,即查询条件:

 "$match": { "name": "Andre", "fruits.active": true, "cars.active": true } 

用英文:“find我的所有文件, name = Andre ,至less有一个活跃的水果,至less有一个活跃的汽车。

所以你明确要求在没有活动水果和汽车的情况下不要得到任何结果,因此结果是空的。