MongoDB过滤多个子文档

我在mongo数据库中有这样的文档结构,我想过滤只显示活动的子文档:活跃的汽车和活跃的水果。

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

这是我想要的结果。

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

我尝试过Aggregate但是当任何车辆或任何水果活跃时,它都不会返回。

  m_object.aggregate([ { $match : { "name": "andre" }}, { $unwind : "$fruits" }, { $unwind : "$cars" }, { $match : { 'fruits.active':{$eq: true} }}, { $match : { 'cars.active':{$eq: true} }}, { $group : { "name": "$name", cars: { $addToSet : "$cars" } fruits: { $addToSet : "$fruits" } }} ], function (err, result) { if (err) { console.log(err); return; } console.log('result'); }); 

有什么办法可以省略这些子文档中的"active":false子文档?

使用以下聚合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'); }); 

或者,您可以使用聚合stream水线生成器,如下所示:

 m_object.aggregate() .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 }) .exec(callback);