db.foos.aggregate(
[
{ $project : { day : {$substr: ["$TimeStamp", 0, 10] }}},
{ $group : { _id : "$day", number : { $sum : 1 }}},
{ $sort : { _id : 1 }}
]
)
Nhóm theo ngày có thể được thực hiện theo hai bước trong khuôn khổ tổng hợp, cần thêm bước thứ ba để sắp xếp kết quả, nếu muốn sắp xếp:
-
$project
kết hợp với$substr
lấy 10 ký tự đầu tiên (YYYY:MM:DD) của đối tượng ISODate từ mỗi tài liệu (kết quả là một tập hợp các tài liệu có các trường "_id" và "ngày"); -
$group
nhóm theo ngày, thêm (tổng hợp) số 1 cho mỗi tài liệu phù hợp; -
$sort
tăng dần theo "_id", là ngày từ bước tổng hợp trước đó - đây là tùy chọn nếu muốn có kết quả được sắp xếp.
Giải pháp này không thể tận dụng các chỉ mục như db.twitter.ensureIndex( { TimeStamp: 1 } )
, bởi vì nó chuyển đổi đối tượng ISODate thành đối tượng chuỗi một cách nhanh chóng. Đối với các bộ sưu tập lớn (hàng triệu tài liệu), điều này có thể là một nút thắt về hiệu suất và nên sử dụng các phương pháp tiếp cận phức tạp hơn.