【问题标题】:How to query in list inside list inside list.... MongoDB aggregate query如何在列表中的列表中查询... MongoDB聚合查询
【发布时间】:2021-01-12 04:08:53
【问题描述】:

我有一个文档集合“EvaluationGroups”,其中每个评估组对象都有一个Evaluation列表。 每个评估对象都有一个 Detail 对象列表。 每个 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 个结果,因为我知道我确实有给出该标签的评估(带有该 ID 和值)..

任何帮助将不胜感激!

【问题讨论】:

  • 向我们展示一些示例文档
  • 是的,显示一些文件。您是否尝试过使用 $unwind 运算符?你应该得到更多的文件,但这样更容易操作。文档:docs.mongodb.com/manual/reference/operator/aggregation/unwind
  • @Gibbs,我添加了文档的示例图片!
  • @Pilybius 我编辑添加了文档的示例图像
  • Labels 数组内部有多重匹配的场景吗?

标签: arrays mongodb mongodb-query aggregation-framework any


【解决方案1】:

Playground

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

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

具有与给定标签相同的 LabelId 和 LabelValue(字符串)的任何标签的详细信息

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

如果有多个匹配,它将只返回第一个匹配。它的工作原理类似于$elemMatch 如果您需要检索具有给定 Id 和值的所有匹配标签,则需要使查询变得复杂。

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

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

【讨论】:

  • 是的,我在这里将 LabelId 更改为 Id 以减少混乱,但我使用它很好。这仍然返回 0 个结果。我需要在其详细信息中包含任何标签组合中具有此标签的评估。(我需要使用 $match,因为之前发生了一些查找和其他事情)
猜你喜欢
  • 1970-01-01
  • 2017-08-06
  • 1970-01-01
  • 2021-10-09
  • 2013-03-31
  • 2019-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多