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:
-
$projectkết hợp với$substrlấ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"); -
$groupnhóm theo ngày, thêm (tổng hợp) số 1 cho mỗi tài liệu phù hợp; -
$sorttă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.