2016-07-21 2 views
1

В Монго У меня есть структура данных, как это:Как запросить элементы массива в монго, чтобы все вложенные элементы проходили заданное условие?

db.elements

{ 
    id: 1, 
    arr: [ 
    {status: true}, 
    {status: false} 
    ] 
}, 

{ 
    id: 2, 
    arr: [ 
    {status: true}, 
    {status: true} 
    ] 
} 

Мне нужно найти предметы, где статус == верно для всех элементов в обр. Я ожидаю увидеть элемент с id == 2.

НО

db.elements.find({'arr.status': true}) 

вернется как

ответ

1

Вы можете выполнить aggregate к:

  • $unwind ваш массив
  • $group по $_id и $arr.status
  • $group по $_id и построить массив всех различных значений status (так он даст вам [истина, ложь] или [верно] или [ложь])
  • $match все записи, которые имеют прежний размер массива == 1 & & первый элемент true

монго запрос:

db.elements.aggregate([{ 
    "$unwind": "$arr" 
}, { 
    "$group": { 
     "_id": { 
      id: "$id", 
      value: "$arr.status" 
     } 
    } 
}, { 
    "$group": { 
     "_id": "$_id.id", 
     value: { 
      $addToSet: '$_id.value' 
     } 
    } 
}, { 
    "$match": { 
     "value": { 
      "$size": 1, 
     }, 
     "value.0": true 
    } 
}]); 

Here демонстрационный

+0

Спасибо! Мой последний запрос выглядит так: * db.elements.aggregate ([{$ unwind: '$ arr'}, {$ group: {_id: '$ id' , status: {$ addToSet : '$ arr.status'}}}, {$ match: {'status': {$ size: 1}, 'status.0': true}}]) * – Warlock

Смежные вопросы