Как выполнить запрос в списке внутри списка внутри списка…. Агрегированный запрос MongoDB

#arrays #mongodb #mongodb-query #aggregation-framework #any

#массивы #mongodb #mongodb-запрос #агрегация-фреймворк #Любой

Вопрос:

У меня есть коллекция документов «EvaluationGroups«, в которой каждый объект группы оценки имеет список оценок. Каждый объект оценки имеет список объектов Detail. И каждая деталь содержит список объектов Label. Label — это объект со свойством с именем «labelId» и свойством с именем «Value». (Детали определяют комбинацию меток и показывают некоторые другие данные, и каждая комбинация меток представляет другой тип оценки).

Пример документа:

введите описание изображения здесь

Что я хотел бы сделать, так это отфильтровать все оценки в списках внутри EvaluationGroups, которые содержат сведения с любой меткой с тем же labelId и LabelValue (строками) заданной метки. Итак, подводя итог, я хочу отфильтровать оценки по метке.

Как я могу добиться этого с помощью запроса mongodb, используя этапы агрегирования и сопоставления?

Я попробовал это:

 { "$match" : 
{ 
    "$expr" : { 
            $anyElementTrue: {
                        $and: [
                            { $eq: [ "$Evaluations.Details.Labels.LabelId", "5fe34b13f0031e1078e08b5c" ] },
                            { $eq: [ "$Evaluations.Details.Labels.Value", "CREDIT" ] }
                        ]
            }
    } }}
 

Но я получаю 0 результатов, зная, что у меня есть оценки, в которых указана эта метка (с этим идентификатором и значением)..

Любая помощь будет оценена!

Комментарии:

1. покажите нам несколько примеров документов

2. Верно, показать некоторые документы. Вы пробовали использовать оператор $unwind ? Вы должны получить намного больше документов, но тогда ими легче манипулировать. Документ: docs.mongodb.com/manual/reference/operator/aggregation/unwind

3. @Gibbs, я добавил образец изображения документа!

4. @Pilybius Я отредактировал, чтобы добавить образец изображения документа

5. Есть ли у вас сценарий множественного совпадения внутри массива меток?

Ответ №1:

Игровая площадка

Вы использовали Id , тогда как ваше поле есть LabelId . Следовательно, это не сработало.

Вы можете упростить свой запрос, как указано ниже

имейте сведения с любой меткой с тем же labelId и LabelValue (строками), что и у указанной метки

 {
    "$match": {
      $and: [
        {
          "Evaluations.Details.Labels.LabelId": 1
        },
        {
          "Evaluations.Details.Labels.Value": "b"
        }
      ]
    }
  }
 

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

Если это полное требование, вы можете использовать этот вариант

 db.collection.find({
  $and: [
    {
      "Evaluations.Details.Labels.LabelId": 1
    },
    {
      "Evaluations.Details.Labels.Value": "b"
    }
  ]
})
 

Комментарии:

1. Да, я изменил labelId на Id здесь, чтобы сделать его менее запутанным, но я использовал его хорошо. Это по-прежнему возвращает 0 результатов. Мне нужны оценки, которые имеют эту метку в любой комбинации меток в своих деталях.. (Мне нужно использовать $match, потому что раньше происходил некоторый поиск и другие вещи)