Как запросить в списке внутри списка внутри списка совокупный запрос MongoDB

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

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

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

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

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

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

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

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

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


person letie    schedule 12.01.2021    source источник
comment
покажите нам несколько образцов документов   -  person Gibbs    schedule 12.01.2021
comment
Правда, покажите какие-нибудь документы. Вы пробовали использовать оператор $unwind? Вы должны получить больше документов, но тогда ими будет легче манипулировать. Документ: docs.mongodb.com/manual/reference/operator/aggregation/ расслабиться   -  person Polybius    schedule 12.01.2021
comment
@Gibbs, я добавил образец изображения документа!   -  person letie    schedule 12.01.2021
comment
@Pilybius Я отредактировал, чтобы добавить образец изображения документа   -  person letie    schedule 12.01.2021
comment
У вас есть сценарий множественного совпадения внутри массива меток?   -  person Gibbs    schedule 12.01.2021
comment
Зачем вам особенно нужен anyElementTrue ?   -  person Gibbs    schedule 12.01.2021
comment
@Gibbs Мне это особо не нужно, я просто проверял.. Я до сих пор не могу найти способ сделать это..   -  person letie    schedule 12.01.2021


Ответы (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"
    }
  ]
})
person Gibbs    schedule 12.01.2021
comment
Да, я изменил LabelId на Id здесь, чтобы сделать его менее запутанным, но я хорошо его использовал. Это по-прежнему возвращает 0 результатов. Мне нужны оценки, которые имеют эту метку в любой комбинации меток в ее деталях.. (Мне нужно использовать $match, потому что до этого происходит некоторый поиск и другие вещи) - person letie; 12.01.2021
comment
Да! Ваш ответ сделал свое дело. Спасибо! - person letie; 20.01.2021