【问题标题】:How to find count based on condition in MOngoDB Aggregation?如何根据 MOngoDB 聚合中的条件查找计数?
【发布时间】:2021-12-07 23:41:49
【问题描述】:

我需要获取不同的 categoryCode 和 categoryName 并使用重复的文档数量的组合打印计数。这是匹配操作的一个条件,根据 cat_type 获取所有文档,如果 cat_type 不存在,则在类别响应计数中显示为 0 样本数据:

[
   {
      "cat_id":1,
      "categoryCode":"categoryCode1",
      "categoryName":"categoryName1",
      "cat":[
         {
            "type":"A"
         },
         {
            "type":"B"
         },
         {
            "type":"C"
         }
      ]
   },
   {
      "cat_id":2,
      "categoryCode":"categoryCode1",
      "categoryName":"categoryName1",
      "cat":[
         {
            "type":"A"
         }
      ]
   },
   {
      "cat_id":3,
      "categoryCode":"categoryCode2",
      "categoryName":"categoryName2",
      "cat":[
         {
            "type":"C"
         }
      ]
   },
   {
      "cat_id":4,
      "categoryCode":"categoryCode3",
      "categoryName":"categoryName3",
      "cat":[
         {
            "type":"A"
         }
      ]
   }
]

预期输出:此处与 type='A' 匹配,category1 和 category3 具有 type='A' 然后计数正常打印,但 category2 没有此 cat_type 然后 category2 也显示为响应 cat_count=0

[
   {
      "categoryCode":"categoryCode1",
      "categoryName":"categoryName1",
      "cat_count": 2
   },
   {
      "categoryCode":"categoryCode2",
      "categoryName":"categoryName2",
      "cat_count": 0
   },
   {
      "categoryCode":"categoryCode3",
      "categoryName":"categoryName3",
      "cat_count": 1
   }
]

我正在使用查询-但查询与外部字段一起工作,但不适用于基于数组的条件

db.collection.aggregate([
   {
      "$group":{
         "_id":{
            "categoryCode":"$categoryCode",
            "categoryName":"$categoryName"
         },
         "catCount":{
            "$sum":{
               "$cond":{
                  "if":{
                     "$eq":[
                        "$cat.type",
                        "A"
                     ]
                  },
                  "then":1,
                  "else":0
               }
            }
         }
      }
   },
   {
      "$project":{
         "categoryCode":"$_id.categoryCode",
         "categoryName":"$_id.categoryName",
         "catCount":1,
         "_id":0
      }
   }
])

【问题讨论】:

  • 您只需要在$group 之前添加一个$unwind?喜欢this?
  • 如果你展开然后按 cat_type 计数值重复。但我需要基于重复文档的计数值,因为 cat_type 是数组并且它会增加计数

标签: mongodb mongoose mongodb-query aggregation-framework spring-data-mongodb


【解决方案1】:

只需要使用$in运算符条件而不是$eq运算符条件,

  {
    $group: {
      _id: {
        "categoryCode": "$categoryCode",
        "categoryName": "$categoryName"
      },
      "cat_count": {
        $sum: {
          $cond: [{ $in: ["A", "$cat.type"] }, 1, 0]
        }
      }
    }
  }

Playground

【讨论】:

  • 谢谢,现在可以使用了。我需要实现对最佳匹配进行排序的搜索,所以可以使用 mongo。我在这里创建一个问题-stackoverflow.com/questions/69686310/…
  • 嗨@turivishal,上面您的解决方案是正确的,并且您正在使用“in”运算符并且仅传递单个输入“A”,如果在输入样本数据中与 cat_type 平行的另一个字段是描述。并且需要使用 cat 类型“A”和描述 X 进行条件化,那么我该如何编写查询。
  • 你可以试试$and算子条件mongoplayground.net/p/G4yxEenwFKO
【解决方案2】:

您可以尝试先通过$reduce 评估/计算cat 数组中type: A 元素的数量。然后$sum$group中的结果得到你的答案。

{
    "$group": {
      "_id": {
        "categoryCode": "$categoryCode",
        "categoryName": "$categoryName"
      },
      "catCount": {
        "$sum": {
          "$reduce": {
            "input": "$cat",
            "initialValue": 0,
            "in": {
              "$cond": {
                "if": {
                  $eq: [
                    "$$this.type",
                    "A"
                  ]
                },
                "then": {
                  // add 1 to accumulator if type is A
                  $add: [
                    "$$value",
                    1
                  ]
                },
                // otherwise, simply keep the accumulator as-is
                "else": "$$value"
              }
            }
          }
        }
      }
    }
}

这是Mongo playground 供您参考。

【讨论】:

  • 嗨@ray,上面的解决方案是正确的,并且您使用的是'in'运算符并且只传递了单个输入“A”,如果在输入样本数据中还有一个与cat_type平行的字段是描述。并且需要使用 cat 类型“A”和描述 X 进行条件化,那么我该如何编写查询。
  • @prabhakarsrivastava 你的意思是this?
  • 是的,这是预期的输出,但我认为这里有很多关于如何在 Java 语言中进行上述聚合的聚合。
  • @prabhakarsrivastava 抱歉,我不是 java 专家,我在适应方面的帮助有限。我的建议是问一个关于适应的新问题,并保持这个问题的重点,就像现在一样。
  • 谢谢,对我也有帮助,让我试试用java实现
猜你喜欢
  • 1970-01-01
  • 2019-02-11
  • 2018-07-09
  • 2017-08-29
  • 2021-12-01
  • 2022-01-03
  • 2021-07-26
  • 2019-01-14
相关资源
最近更新 更多