Запрос MongoDB для поиска списка во вложенном массиве

#mongodb #mongodb-query

#mongodb #mongodb-запрос

Вопрос:

У меня есть коллекция с документами, подобными этой:

 {
    "date" : 20200817,
    "items" : [ 
        {
            "name" : "item1", "values" : ["val1", "val2", "val3", "val4"]
        }, 
        {
            "name" : "item2", "values" : ["val1", "val4"]
        }, 
        {
            "name" : "item3", "values" : ["val1", "val3"]
        }
    ]
}
  

Я хочу получить список name из items , val3 который values существует в, как это

['item1', 'item3']

У меня есть этот запрос :

 db.test.find({
    'dateM': 20200817,
    'items': {
        '$elemMatch':{
            'values':{
                '$elemMatch':{
                    $in:['val3']
                }
            }
         }
     }
}, {'lists.name': 1})
  

но я получаю список имен всех элементов.

Где мой запрос неверен?

Что я могу сделать?

Спасибо

Ответ №1:

Вам нужно использовать агрегацию там. Это один из способов, которым вы можете достичь

 [
  {
    $project: {
      output: {
        $map: {
          input: {
            $filter: {
              input: "$items",
              cond: {
                $in: [
                  "val3",
                  "$$this.values"
                ]
              }
            }
          },
          in: "$$this.name"
        }
      }
    }
  }
]
  

Работает игровая площадка Mongo

Ответ №2:

Ваш запрос должен возвращать только документы, которые содержат хотя бы один элемент с val3 .

Если достаточно вернуть только первый соответствующий элемент, вы используете проекционную форму $elemMatch, в противном случае вам нужно будет либо использовать агрегацию, либо фильтровать массив на стороне клиента.