按日期的MongoDB聚合

时间:2014-07-17 12:27:14

标签: node.js mongodb mongoose aggregation-framework

以下是我的收藏品的外观......

{
  "_id" : ObjectId("53c66071409aeb38133c6ece"),
  "starttime" : ISODate("2014-07-15T11:22:25Z"),
  "product" : "1",
  "customer" : "Microsoft"
}
{
  "_id" : ObjectId("53c66071409aeb38133c6ecf"),
  "starttime" : ISODate("2014-07-15T11:22:25.882Z"),
  "customer" : "Microsoft",
}

{
  "_id" : ObjectId("53c66072409aeb38133c6ed0"),
  "starttime" : ISODate("2014-07-16T11:22:26.15Z"),
  "customer" : "Microsoft",
}

{
  "_id" : ObjectId("53c66072409aeb38133c6ed0"),
  "starttime" : ISODate("2014-07-16T11:22:27.15Z"),
  "customer" : "Apple",
}

我想按日期对数据进行分组 并格式化输出所以它显示如下......(我已经评论了我缺少的东西)

[
  {
    "_id": {
      "date": {
        "year": 2014,
        "month": 7,
        "day": 16
      }
    },
    "productions": [
      {
        "name": "Microsoft",
        "number": 1 //THIS IS MISSING AT THE MOMENT
      },
      {
        "name": "Apple",
        "number": 1 //THIS IS MISSING AT THE MOMENT
      }
    ],
    "total": 2
  },
  {
    "_id": {
      "date": {
        "year": 2014,
        "month": 7,
        "day": 15
      }
    },
    "productions": [
      {
        "name": "Microsoft",
        "number": 2 //THIS IS MISSING AT THE MOMENT
      }
    ],
    "total": 2
  }
]

我按照问题groups by month and year using mongoose.js给出的答案 而且我很接近解决这个问题,但并不完全解决这个问题。我现在正处于无法真正看到树木的地方!

到目前为止,这是我的代码......

Job.aggregate({
            $project: {
                date: {
                    year: {
                        $year: "$starttime",
                    },
                    month: {
                        $month: "$starttime"
                    },
                    day: {
                        $dayOfMonth: "$starttime"
                    }
                },
                customer: "$customer",
            }
        }, {
            $group: {
                _id: {
                    date: {
                        year: "$date.year",
                        month: "$date.month",
                        day: "$date.day"
                    },
                },
                productions: {
                    $addToSet: {
                        name: "$customer",
                    },
                },
                total: {
                    $sum: 1
                }
            },
        },
        function(error, customers) {
            if (error) res.json(error);
            res.json(customers);
        })

缺少的是每个日期的“产品编号”总计。我刚收到日期总计。 谁能告诉我哪里出错了?我非常感激。感谢。

1 个答案:

答案 0 :(得分:0)

要实现您的目标,您需要在汇总管道中使用2 $group个阶段。

db.Job.aggregate([
    {"$project" : {"date":{"year":{"$year":"$starttime"},"month":{"$month":"$starttime"},"day":{"$dayOfMonth":"$starttime"}},"customer":"$customer"}}, 
    // Group by "customer" as well
    {"$group" : {
        "_id":{"date":{"year":"$date.year","month":"$date.month","day":"$date.day",customer:"$customer"}},
        "total":{"$sum":1}
    }}, 
    // Adding a $project phase just to simplify the JSON
    {"$project" : {year:"$_id.date.year", month:"$_id.date.month", day:"$_id.date.day", customer:"$_id.date.customer", total:"$total", _id:0}}, 
    // Second group phase to get the desired output
    {"$group" : {
        _id:{year:"$year", month:"$month", day:"$day"}, 
        productions:{$addToSet:{name:"$customer", number:"$total"}}, 
        total:{$sum:"$total"}
    }}
])

以上查询产生输出:

{
        "result" : [
                {
                        "_id" : {
                                "year" : 2014,
                                "month" : 7,
                                "day" : 15
                        },
                        "productions" : [
                                {
                                        "name" : "Microsoft",
                                        "number" : 2
                                }
                        ],
                        "total" : 2
                },
                {
                        "_id" : {
                                "year" : 2014,
                                "month" : 7,
                                "day" : 16
                        },
                        "productions" : [
                                {
                                        "name" : "Microsoft",
                                        "number" : 1
                                },
                                {
                                        "name" : "Apple",
                                        "number" : 1
                                }
                        ],
                        "total" : 2
                }
        ],
        "ok" : 1
}

为了更好地了解正在发生的事情,请参阅管道每个阶段的输出。