2016-12-27 22 views
0

有没有任何方法可以在没有根文档的情况下从集合的字段(数组)中选择所有嵌入式文档?例如,给定这个集合MongoDB按照无标准条件选择所有嵌入式文档

{ "_id" : 1, "cars" : [{"brand": "audi", "color": "red"}, {"brand": "audi", "color": "yellow"}]} 
{ "_id" : 2, "cars" : [{"brand": "audi", "color": "blue"}, {"brand": "seat"}]} 

我想与下面的输出选择所有汽车品牌audi

{"brand": "audi", "color": "red"} 
{"brand": "audi", "color": "blue"} 
{"brand": "audi", "color": "yellow"} 

这似乎并不可能只db.collection.find()projection,因为它的匹配标准始终与根文档相关。

+0

@SagarReddy这将选择至少有一辆汽车匹配brand ='audi'的所有根对象。但是例如,第二份文件中的“座位”车辆将被错误地包括在内。 –

+0

'db.collection.find({'cars.brand':'audi'},{'cars。$':1})' – styvane

+0

@Styvane这将只会得到第一个匹配记录。我认为OP需要所有匹配的条目。 – Veeram

回答

-1

您可以使用聚合将:

  • $unwind你车阵
  • $match只有奥迪brand
  • $group按品牌&颜色来删除重复
  • $project重组输出

查询:

db.cars.aggregate([{ 
    $unwind: '$cars' 
}, { 
    $match: { 
     'cars.brand': 'audi' 
    } 
}, { 
    $group: { 
     '_id': { 'brand': '$cars.brand', 'color': '$cars.color' } 
    } 
}, { 
    $project: { 
     _id: 0, 
     'brand': '$_id.brand', 
     'color': '$_id.color' 
    } 
}]) 
+0

您是否可以将嵌套文档嵌套$ unwind? –

+0

您可以在根目录之后展开嵌套数组:'db.cars.aggregate([{$ unwind:'$ topArray'},{$ unwind:'$ topArray.cars'}])' –

0

随着蒙戈3.4版本,你可以使用$replaceRoot操作来实现你所追求的。

db.cars.aggregate([{ 
    $unwind: "$cars" 
}, { 
    $match: { 
     "cars.brand": "audi" 
    } 
}, { 
    $replaceRoot: { 
     newRoot: "$cars" 
    } 
}])