Как вернуть только один соответствующий поддокумент (не массив) из массива поддокументов в MongoDB? - PullRequest
0 голосов
/ 15 февраля 2019

В моей коллекции:

{ "code": xx1
  "valueList": [
                  { "id": "yy1", "name": "name1"},
                  { "id": "yy2", "name": "name2"},
                  { "id": "yy3", "name": "name3"}              
               ]
},
{ "code": xx2
  "valueList": [
                  { "id": "yy4", "name": "name4"},
                  { "id": "yy5", "name": "name5"},
                  { "id": "yy6", "name": "name6"}              
               ]
}

Я хочу вернуть ОДИН соответствующий под-документ (не массив), как показано ниже:

{ "id": "yy3", "name": "name3"}  

Я пытаюсь код ниже:

findOne({ "code": "xx1",
          "valueList.name": "yy3"
       })
.select({ "valueList.$": 1});

Вместо него возвращается массив:

 {
   "valueList": [{ "id": "yy3", "name": "name3" }]
 }

Как я могу решить эту проблему?Спасибо

1 Ответ

0 голосов
/ 15 февраля 2019

Вы можете использовать агрегацию ниже:

db.col.aggregate([
    { $match: { "valueList.id": "yy3" } },
    { $unwind: "$valueList" },
    { $match: { "valueList.id": "yy3" } },
    { $replaceRoot: { newRoot: "$valueList" } }
])

Сначала $ match отфильтрует все ненужные документы, затем вы можете использовать $ unwind , чтобы получить valueList элемент за документ, а затем $match снова, чтобы получить только тот, с yy3 на последнем этапе, вы можете использовать $ replaceRoot для продвижения элемента valueList на верхний уровень.

...