0

我有几个看起来像这样的文档(减去许多其他不相关的字段):

  [{
    status: 'open',
    createdDate: 2021-06-17T09:02:58.325Z
  },
  {
    status: 'declined',
    createdDate: 2021-07-25T09:09:15.851Z
  },
  {
    status: 'declined',
    createdDate: 2021-09-22T09:32:14.958Z
  },
  {
    status: 'open',
    createdDate: 2021-09-02T09:45:26.584Z
  },
  {
    status: 'referral',
    createdDate: 2021-09-05T09:46:02.764Z
  }]

对于集合的这个子组,我想汇总下一个结果:

{
    "2021-06" : { submitted: 1, referral: 0, declined: 0},
    "2021-07" : { submitted: 1, referral: 0, declined: 1},
    "2021-08" : { submitted: 0, referral: 0, declined: 0},
    "2021-09" : { submitted: 3, referral: 1, declined: 1},
}

提交的文件总数(打开、推荐和拒绝)。我尝试以多种方式使用 $group ,但没有成功。有什么建议么?谢谢!

4

2 回答 2

0

询问

  • 按日期分组为字符串,只有年和月
  • 计数 3 个累加器,第一个总是加,第二个和第三个只有在看到状态打开(第二个)和状态(拒绝)第三个时才加
  • 将根和数组替换为对象,以使数据成为键,并将数据作为嵌套文档,就像您预期的输出一样

测试代码在这里

aggregate(
[{"$group":
  {"_id":{"$dateToString":{"date":"$createdDate", "format":"%Y-%m"}},
   "submitted":{"$sum":1},
   "referral":{"$sum":{"$cond":[{"$eq":["$status", "open"]}, 1, 0]}},
   "declined":
   {"$sum":{"$cond":[{"$eq":["$status", "declined"]}, 1, 0]}}}},
 {"$replaceRoot":
  {"newRoot":
   {"$arrayToObject":
    [[{"k":"$_id",
       "v":
       {"submitted":"$submitted",
        "referral":"$referral",
        "declined":"$declined"}}]]}}}])
于 2022-02-03T16:09:32.207 回答
0

OP 要求提供一种解决方案,其中值成为键,例如2021-06: {.... 本着良好数据设计的精神,我可能会建议一个更简单的管道,将日期值保留为一个值:

db.foo.aggregate([
    // The SAME as answer above!
    {$group: {
        "_id":{"$dateToString":{"date":"$createdDate", "format":"%Y-%m"}},
        "submitted":{"$sum":1},
        "referral":{"$sum":{"$cond":[{"$eq":["$status", "open"]}, 1, 0]}},
        "declined":{"$sum":{"$cond":[{"$eq":["$status", "declined"]}, 1, 0]}}
    }}
]);

屈服

{ "_id" : "2021-06", "submitted" : 1, "referral" : 1, "declined" : 0 }
{ "_id" : "2021-07", "submitted" : 1, "referral" : 0, "declined" : 1 }
{ "_id" : "2021-09", "submitted" : 3, "referral" : 1, "declined" : 1 }

现在您可以排序、过滤等,而无需通过$objectToArrayetc 将键转换为 rval。如果完全有必要拥有一个更具描述性的键名_id(并且不会因保留而造成混淆_id),则附加以下阶段:

    ,{$addFields: {"date":"$_id"}}
    ,{$unset: "_id"}
于 2022-02-03T17:00:16.000 回答