#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, потому что раньше происходил некоторый поиск и другие вещи)