如何在list inside list inside list中查询.... MongoDB聚合查询

How to query in list inside list inside list.... MongoDB aggregate query

我有一个文档集合“EvaluationGroups”,其中每个评估组对象都有一个 Evaluations 列表。 每个 Evaluation 对象都有一个 Detail 对象的列表。 每个 Detail 都包含一个 Label 对象的列表。 Label 是一个对象,具有名为“LabelId”的 属性 和名为“Value”的 属性。 (details定义了一个标签的组合,并展示了一些其他的数据,每个标签的组合代表了一种不同的评价类型)。

示例文档:

我想做的是过滤 EvaluationGroups 内列表中的所有 Evaluation,这些 Evaluation 的 Details 和任何 Label 具有给定 Label 的相同 LabelId 和 LabelValue(字符串)。 因此,总而言之,我想按标签过滤评价。

如何使用聚合和匹配阶段通过 mongodb 查询实现此目的?

我试过这个:

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

但我得到 0 个结果,因为我知道我确实有给出该标签的评估(带有该 ID 和值)..

如有任何帮助,我们将不胜感激!

Playground

您使用了 Id 而您的字段是 LabelId。因此它没有用。

您可以按如下所述简化您的查询

have Details with any Label with the same LabelId and LabelValue (strings) of a Label given

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

如果有多个匹配,它会return只匹配第一个。它的工作方式类似于 $elemMatch 如果您需要检索具有给定 ID 和值的所有匹配标签,则需要使查询复杂化。

如果是完整的需求,可以使用this variant

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