如何在mongoDB中按上半月或下半月(两周)对日期进行分组



使用以下数据结构,使用mongoDB的(v3.4(聚合框架,如何每15天对信息进行分组?

{
    "_id" : ObjectId("5cb10a201e20af7503305fea"),
    "user" : ObjectId("5b21240c4e71161fdd40b27c"),
    "version" : NumberLong(2),
    "value" : 42,
    "itemRef" : ObjectId("5cb10a201e20af7503305fe9"),
    "status" : "ACCEPTED",
    "date" : ISODate("2019-04-13T11:00:00.466Z")
}

所需的输出为:

[date: 2019/01/01, totalValue:15],
[date: 2019/01/16, totalValue:5],
[date: 2019/02/01, totalValue:25],
[date: 2019/02/16, totalValue:30]

我发现使用 mongoDB 3.4 解决此问题的方法是使用 $cond + $dayOfMonth 来定义这个日期在哪个月的哪个部分。

db.contract.aggregate(
[
  {$match:{...queryGoesHere...}},
  {$project:
    {dateText:
      {$cond:
        [
          {$lte:[{$dayOfMonth:$date},15]},
          ['$dateToString': ['format': '%Y-%m-01', 'date': '$date']], 
          ['$dateToString': ['format': '%Y-%m-16', 'date': '$date']]
        ]
      }
     value:'$value'
    }
  },
  {$group:
    {
      _id:'$dateText',
      total:{'$sum':1}
    }
  }
]

解决方案是在"dateText"的投影中,它首先使用$cond来确定日期是在月的第一部分还是在第二部分。它使用"$dayOfMonth"来确定这一点,该"会反映月份中的某一天。如果它小于或等于 15,则使用"$dateToString"按年-月-01 格式化日期,否则将其格式化为年-月-16。

希望这可以帮助将来的某人。

最新更新