【问题标题】:Mongo $cond if expression doesn't work like $matchMongodb $cond if 表达式不像 $match
【发布时间】:2021-10-01 16:19:27
【问题描述】:

我有一个包含“父”字段的文档的集合。

[
      {
        "parent": "P1",
        "tagGroups": [],
        
      },
      {
        "parent": "P1",
        "tagGroups": [
          {
            group: 1,
            tags: {
              tag1: {
                value: true
              },
              tag2: {
                value: "foo"
              },
              
            }
          },
          {
            group: 2,
            tags: {}
          }
        ]
      },
      {
        "parent": "P2",
        "tagGroups": [],
        
      }
    ]

当至少有一个符合我的条件时,我想请求检索具有相同父级的所有文档:tag1.value = true。

预期:

[
      {
        "parent": "P1",
        "tagGroups": [],

      },
      {
        "parent": "P1",
        "tagGroups": [
          {
            group: 1,
            tags: {
              tag1: {
                value: true
              },
              tag2: {
                value: "foo"
              },

            }
          },
          {
            group: 2,
            tags: {}
          }
        ]
      }
    ]

为此,我想使用 $cond 标记每个文档,然后按父级分组。

https://mongoplayground.net/p/WiIlVeLDrY-

但“if”部分的工作方式似乎与 $match 不同

https://mongoplayground.net/p/_jcoUHE-aOu

您还有其他有效的方法来进行这种查询吗?

编辑:我可以使用查找阶段,但我害怕表现不佳

谢谢

【问题讨论】:

  • 请提供一些预期的输入输出
  • 嗨,第一个链接显示了我想要做什么,预期的结果是前 2 个文档,而不是没有。

标签: mongodb aggregation-framework


【解决方案1】:

您没有提到您想要实现的目标,但您希望您尝试过的代码(第一个链接)应该可以工作。您需要在查询中使用$in 而不是$eq

db.collection.aggregate({
  "$addFields": {
    "match": {
      "$cond": [
        { $in: [ true, "$tagGroups.tags.tag1.value" ] }, 1, 0] }
  }
},
{
  "$group": {
    "_id": "$parent",
    "elements": { "$addToSet": "$$ROOT" },
    "elementsMatch": { "$sum": "$match" }
  }
},
{ "$match": { "elementsMatch": { $gt: 0 } }},
{ "$unwind": "$elements"}
)

工作Mongo playground

注意:您已经询问了有效的方法。更好的是你需要发布预期的结果

【讨论】:

  • 谢谢!它正在工作。我编辑了我的帖子以使其更加清晰。我正在尝试将您的语法与 spring boot mongo data api一起使用。你认为这是更有效的方式吗?
  • $unwind 更贵。所以在使用的时候一定要小心。否则一切都很好。另外我的观点是,如果这是一个团队项目,最好避免聚合并使用人类可读的 jpa 方法,如 findBy...() 和 java 方法。因为编写聚合可能是因人而异的......
  • 我找不到另一种方法来进行此类查询而无需聚合。 Spring 有一个优雅的流利的 api,我们可以使用它,但在某些情况下它可能会很棘手。我在示例中避免了很多复杂性,并且它没有反映我的用例($cond 是动态的)。我刚刚遇到的一个大问题是,在聚合中构建标准的 Spring API 是为 $match 阶段制作的,它不符合 $cond。
  • 那么您可以随意使用带有@Aggregation 注释或mongoTemplate 的聚合
  • 我努力让它能够使用 $in (在删除评论中要求)。 mongoplayground.net/p/pkBARDY3s83
猜你喜欢
  • 2014-07-19
  • 1970-01-01
  • 2023-03-07
  • 2019-02-25
  • 2022-07-28
  • 2018-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多