【问题标题】:MongoDB group aggregation with condition in $sum带有 $sum 条件的 MongoDB 组聚合
【发布时间】:2020-02-06 19:20:22
【问题描述】:

我的数据库的集合如下所示

[{ 
   _id:1,
   status:"active",
   sale: 4,
   createdAt:"2019-10-08 08:46:19"
},
{
   _id:2,
   status:"inactive",
   sale:5,
   createdAt:"2019-10-08 06:41:19"
},
{
   _id:2,
   status:"inactive",
   sale:5,
   createdAt:"2019-10-08 02:01:19"
}]

我需要按“天”分组。我想要的结果

[{
  createdAt:"2019-10-08 02:01:19",
  inactive: 2,
  active:1,
  salesOfActive: 4,
  salesOfInactive:10
}]

我没有得到实际结果,我需要任何帮助将不胜感激

我曾尝试过,但不知道如何获得 salesOfActivesalesOfInactive每天

{
        $group: {
          _id: {
            day: { $dayOfMonth: "$createdAt" }
          },
          inActive:{$sum: { status:"inactive"}},
          active:{$sum: { status:"active"}},
          salesOfActive: { $sum:$sale  }
        }
}

【问题讨论】:

  • 您是否只想让salesOfActive 反映销售字段的总和?如果是这样,你所拥有的应该可以工作。
  • 不,我希望总计在“saleOfInactive”中,其中状态为“不活动”,总计在“saleOfActive”中,其中状态为“活动”
  • 哦,我明白了。因此,您可能在同一天有多个 inactiveactive 条目,并且您想知道有多少销售...嗯,您可能需要多个阶段,我会尝试一些事情。

标签: javascript mongodb mongoose mongodb-query aggregation-framework


【解决方案1】:

基本上你需要$sum每个字段$conditionally在这里

db.collection.aggregate([
  { "$group": {
    "_id": {
      "$dayOfMonth": { "$dateFromString": { "dateString": "$createdAt" } }
    },
    "inactive": {
      "$sum": { "$cond": [{ "$eq": ["$status", "inactive"] }, 1, 0] }
    },
    "active": {
      "$sum": { "$cond": [{ "$eq": ["$status", "inactive"] }, 0, 1] }
    },
    "salesOfInactive": {
      "$sum": { "$cond": [{ "$eq": ["$status", "inactive"] }, "$sale", 0] }
    },
    "salesOfActive": {
      "$sum": { "$cond": [{ "$eq": ["$status", "inactive"] }, 0, "$sale"] }
    }
  }}
])

MongoPlayground

【讨论】:

  • 如何在 Java 中实现这一点?
猜你喜欢
  • 2021-10-31
  • 2023-01-13
  • 2018-07-09
  • 2021-01-11
  • 1970-01-01
  • 2021-08-23
  • 2017-02-22
  • 1970-01-01
相关资源
最近更新 更多