2016-11-03 271 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驱动程序。 首先我查询外部文档,即集合对象。 (函数(docs){}){doc.findOne({“applianceType”:“light”},{“collection”:{$ elemMatch:{“category”:“ceiling_light”}}}}) .then ' 此文档对象包含items数组。所以我做了这个 'var lightItemData = docs.collection [0]; (函数(docs2){}){0} {0} {0} {0} {0}项目ID:{LI electatch:{id:“LI-CHL1234”}}}) .then NodeJS抛出错误** lightItemData.findOne()**不是一个函数。 – somnathbm

+0

我的答案可能有点误导。更新。 'docs'不是你可以使用mongodb查询的东西。这是一个有效的JS对象。因此,只需使用'for'循环获取想要的字段,或者如果您更喜欢功能性的方式,则可以进行过滤。 – yehe