Có sẵn các toán tử tổng hợp ngày cho khuôn khổ tổng hợp của MongoDB. Ví dụ:một $dayOfYear
toán tử được sử dụng để lấy giá trị đó từ ngày sử dụng trong nhóm:
db.collection.aggregate([
{ "$group": {
"_id": { "$dayOfYear": "$datetime" },
"total": { "$sum": "$count" }
}}
])
Hoặc bạn có thể sử dụng phương pháp toán học ngày thay thế. Bằng cách áp dụng ngày kỷ nguyên, bạn chuyển đổi đối tượng ngày thành một số mà phép toán có thể được áp dụng:
db.collection.aggregate([
{ "$group": {
"_id": {
"$subtract": [
{ "$subtract": [ "$datetime", new Date("1970-01-01") ] },
{ "$mod": [
{ "$subtract": [ "$datetime", new Date("1970-01-01") ] },
1000 * 60 * 60 * 24
]}
]
},
"total": { "$sum": "$count" }
}}
])
Nếu những gì bạn đang theo đuổi là khoảng thời gian so với thời điểm hiện tại thì điều bạn muốn về cơ bản là phương pháp toán ngày tháng và hoạt động trong một số điều kiện thông qua $cond
nhà điều hành:
db.collection.aggregate([
{ "$match": {
"datetime": {
"$gte": new Date(new Date().valueOf() - ( 1000 * 60 * 60 * 24 * 365 ))
}
}},
{ "$group": {
"_id": null,
"24hours": {
"$sum": {
"$cond": [
{ "$gt": [
{ "$subtract": [ "$datetime", new Date("1970-01-01") ] },
new Date().valueOf() - ( 1000 * 60 * 60 * 24 )
]},
"$count",
0
]
}
},
"30days": {
"$sum": {
"$cond": [
{ "$gt": [
{ "$subtract": [ "$datetime", new Date("1970-01-01") ] },
new Date().valueOf() - ( 1000 * 60 * 60 * 24 * 30 )
]},
"$count",
0
]
}
},
"OneYear": {
"$sum": {
"$cond": [
{ "$gt": [
{ "$subtract": [ "$datetime", new Date("1970-01-01") ] },
new Date().valueOf() - ( 1000 * 60 * 60 * 24 * 365 )
]},
"$count",
0
]
}
}
}}
])
Về cơ bản, cách tiếp cận này giống với ví dụ SQL, trong đó truy vấn đánh giá có điều kiện giá trị ngày tháng có nằm trong phạm vi bắt buộc hay không và quyết định có thêm giá trị vào tổng hay không.
Một bổ sung ở đây là $match
bổ sung để hạn chế truy vấn chỉ hành động trên những mặt hàng có thể nằm trong phạm vi tối đa một năm mà bạn đang yêu cầu. Điều đó làm cho nó tốt hơn một chút so với SQL đã trình bày ở chỗ một chỉ mục có thể được sử dụng để lọc các giá trị đó ra và bạn không cần phải "brute force" thông qua dữ liệu không khớp trong bộ sưu tập.
Luôn luôn là một ý kiến hay để hạn chế đầu vào bằng $match
khi sử dụng đường dẫn tổng hợp.