2016-11-03 11 views
0

Это мои данные.MongoDB поиск вложенного массива объектов

{ 
    "applianceType": "light", 
    "applianceId": "light123", 
    "applianceName": "Light", 
    "applianceImgURL": "https://s3-us-west-2.amazonaws.com/app.tiktok/appliance/icons/lights.svg", 
    "inUsed": false, 
    "collection": [{ 
     "category": "ceiling_light", 
     "catgName": "Ceiling light", 
     "catgImgURL": "https://s3-us-west-2.amazonaws.com/app.tiktok/appliance/catg_thumbs/light/ceiling_light.jpg", 
     "collectionCatgId": "LI-ceil", 
     "items": [{ 
      "id": "LI-CHL1234", 
      "name": "Chandelier", 
      "imgURL": "https://s3-us-west-2.amazonaws.com/app.tiktok/appliance/thumbs/light/chandelier.jpg", 
      "capImgURL": "", 
      "inUsed": false, 
      "editable": true, 
      "quantity": { 
       "number": 1, 
       "multiple": false 
      }, 
      "value": { 
       "state": "OFF", 
       "range": { 
        "minVal": "0", 
        "currentVal": "20", 
        "maxVal": "100" 
       } 
      }, 
      "rooms": [] 
     }, { 
      "id": "LI-PL1234", 
      "name": "Pendant light", 
      "imgURL": "https://s3-us-west-2.amazonaws.com/app.tiktok/appliance/thumbs/light/pendantlight.jpg", 
      "capImgURL": "", 
      "inUsed": false, 
      "editable": true, 
      "quantity": { 
       "number": 1, 
       "multiple": false 
      }, 
      "value": { 
       "state": "OFF", 
       "range": { 
        "minVal": "0", 
        "currentVal": "20", 
        "maxVal": "100" 
       } 
      }, 
      "rooms": [] 
     }] 
    }] 
} 

Все, что я хочу, чтобы получить конкретный документ collection.items

Я попробовал этот запрос до сих пор:

db.myappliance.find(
    { 
     "applianceType": "light" 
    }, 
    { 
     "collection" : { 
      $elemMatch: { 
       "category" : "ceiling_light", 
       "items": { 
        $elemMatch: { 
         "id": "LI-CHL1234" 
        } 
       } 
      } 
     } 
    } 
) 

Этот запрос дает мне все документы внутри коллекции .items. Но я хочу только одного. Я знаю, что у моего вопроса уже много повторяющихся потоков. Но я не мог найти ответы на эти вопросы в моем случае.

ответ

0

Нет способа сделать это на query.

После того, как вы получите результат запроса в коллекциях mongodb, используйте это для извлечения желаемого объекта.

+0

Я просто попробовал ваш подход. Позвольте мне рассказать вам, что я сделал. Я использую драйвер NodeJS. Сначала я запрашиваю внешний документ, т. Е. Объект коллекции. 'doc.findOne ({" applianceType ":" light "}, {" collection ": {$ elemMatch: {" category ":" ceiling_light "}}}) .then (function (docs) {}) ' Этот объект docs содержит массив элементов. Поэтому я сделал это 'var lightItemData = docs.collection [0]; lightItemData.findOne ({"items.id": "LI-CHL1234"}, {items: {$ elemMatch: {id: "LI-CHL1234"}}}) .then (function (docs2) {}) NodeJS бросает мне ошибку, что ** lightItemData.findOne() ** не является функцией. – somnathbm

+0

Мой ответ может быть немного обманчивым. Обновлено. 'docs' - это не то, на что вы можете использовать запрос mongodb. Это действительный объект JS. Таким образом, просто введите требуемое поле, используя цикл 'for', или фильтруйте, если вы предпочитаете функциональный способ. – yehe