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有一个活跃的汽车。
所以你明确要求在没有活动水果和汽车的情况下不要得到任何结果,因此结果是空的。