Như bạn đã tìm thấy, bạn không thể $ đối sánh trên các trường không có trong tài liệu (nó hoạt động giống hệt như cách tìm hoạt động) và nếu bạn sử dụng $ project trước thì bạn sẽ mất khả năng sử dụng các chỉ mục.
Thay vào đó, những gì bạn có thể làm là kết hợp những nỗ lực của mình như sau:
{
aggregate: 'posts',
pipeline: [
{$match: {
created_date :
{$gte:{$date:'2012-09-01T04:00:00Z'},
$lt: {date:'2012-10-01T04:00:00Z'}
}}
}
},
{$group:
{_id: '0',
totalComments:{$sum:'$comments'}
}
}
]
}
Ở trên chỉ cung cấp cho bạn tổng hợp của tháng 9, nếu bạn muốn tổng hợp cho nhiều tháng, bạn có thể lấy ví dụ:
{
aggregate: 'posts',
pipeline: [
{$match: {
created_date :
{ $gte:'2012-07-01T04:00:00Z',
$lt: '2012-10-01T04:00:00Z'
}
},
{$project: {
comments: 1,
new_created: {
"yr" : {"$year" : "$created_date"},
"mo" : {"$month" : "$created_date"}
}
}
},
{$group:
{_id: "$new_created",
totalComments:{$sum:'$comments'}
}
}
]
}
và bạn sẽ nhận lại được những thứ như:
{
"result" : [
{
"_id" : {
"yr" : 2012,
"mo" : 7
},
"totalComments" : 5
},
{
"_id" : {
"yr" : 2012,
"mo" : 8
},
"totalComments" : 19
},
{
"_id" : {
"yr" : 2012,
"mo" : 9
},
"totalComments" : 21
}
],
"ok" : 1
}