Это мои данные.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. Но я хочу только одного. Я знаю, что у моего вопроса уже много повторяющихся потоков. Но я не мог найти ответы на эти вопросы в моем случае.
Я просто попробовал ваш подход. Позвольте мне рассказать вам, что я сделал. Я использую драйвер 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
Мой ответ может быть немного обманчивым. Обновлено. 'docs' - это не то, на что вы можете использовать запрос mongodb. Это действительный объект JS. Таким образом, просто введите требуемое поле, используя цикл 'for', или фильтруйте, если вы предпочитаете функциональный способ. – yehe