MongoDB按条件进行$sum的分组聚合

5

我的数据库集合是以下这样的

[{ 
   _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 反映出销售字段的总和吗?如果是这样,那么你现在的做法应该可以。 - silencedogood
不,我想要在“saleOfInactive”中总计状态为“inactive”的销售额,在“saleOfActive”中总计状态为“active”的销售额。 - Abtisam Ahmed
哦,我明白了。因此,您可能会在同一天有多个“未激活”或“已激活”的条目,并且想要知道有多少销售额... 嗯,您可能需要多个阶段来完成这项任务,我会尝试几种方法。 - silencedogood
1个回答

4
基本上,你需要在此处对每个字段进行$sum操作,并且还需要进行额外的$cond条件操作。
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"] }
    }
  }}
])

播放Mongo


如何在Java中实现这个? - Manan Shah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接