以下是我的收藏品的外观......
{
"_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);
})
缺少的是每个日期的“产品编号”总计。我刚收到日期总计。 谁能告诉我哪里出错了?我非常感激。感谢。
答案 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
}
为了更好地了解正在发生的事情,请参阅管道每个阶段的输出。