2016-12-27 4 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 Это выберет все корневые объекты, имеющие по крайней мере один автомобиль, соответствующий бренду = 'audi'. Но, к примеру, во втором документе будет ошибочно включен один «сидевший» автомобиль. –

+0

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

+0

@Styvane Это будет только первая соответствующая запись. Я думаю, что OP нуждается во всех соответствующих записях. – Veeram

ответ

-1

Вы можете использовать агрегацию, которая будет:

  • $unwind вы автомобилей массив
  • $match только Audi brand
  • $group по марке & цвета, чтобы удалить дубликаты
  • $project реорганизовать OUTPUT

запрос является:

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