按月分组的猫鼬

时间:2018-10-11 04:13:11

标签: node.js mongodb mongoose aggregation-framework

我有费用明细,其中我想按月对费用进行分组,并返回该月和该特定月份的费用。我什至检查了Mongoose文档是否基于月份进行汇总,但由于我保存的日期如 2018年1月12日

,因此我的数据与标准不符。

。有什么办法可以让我获取月份和该月的总额。

我想要-Jan:50,Feb:45等等...

下面是示例集合

{
    "_id": {
        "$oid": "5babee47a7d56e5fb896f181"
    },
    "date": "07-Sep-2018",
    "expenseInfo": "Starbucks",
    "category": "Restaurants",
    "amount": 18
    },
{
    "_id": {
        "$oid": "5bac361597bc8758fc065241"
    },
    "date": "01-Aug-2018",
    "expenseInfo": "Michael kors bag",
    "category": "Shopping",
    "amount": 91
},
{
    "_id": {
        "$oid": "5baceaafc420d147806a8038"
    },
    "date": "14-Sep-2018",
    "expenseInfo": "Gift",
    "category": "Miscellaneous",
    "amount": 100
}

2 个答案:

答案 0 :(得分:2)

您可以尝试使用$toDate

使用mongodb 4.0 进行以下聚合
db.collection.aggregate([
  { "$group": {
    "_id": { "$month": { "$toDate": "$date" }},
    "total": { "$sum": "$amount" }
  }}
])

或者使用$dateFromString

使用mongodb 3.6 及更高版本
db.collection.aggregate([
  { "$group": {
    "_id": { "$month": { "$dateFromString": { "dateString": "$date" }}},
    "total": { "$sum": "$amount" }
  }}
])

答案 1 :(得分:1)

您可以尝试将$split$arrayElemAt运算符用于索引1以返回月份值。

db.colname.aggregate(
[
   {"$group":{
      "_id":{"$arrayElemAt":[{"$split":["$date","-"]},1]},
      "total":{"$sum":"$amount"}
   }}
 ]
)