Đúng. Bạn có thể sử dụng Toán tử Ngày với $ substr và $ concat để gắn kết tất cả lại với nhau.
db.test.aggregate([
{"$group": {
"_id" : { "$concat": [
{"$substr": [{"$year": "$date"}, 0, 4 ]},
"-",
{"$substr": [{"$month": "$date"}, 0, 2 ]},
"-",
{"$substr": [{"$dayOfMonth": "$date"}, 0, 2 ]},
]},
"count": {"$sum": 1 }
}},
{"$sort": { "_id": 1 }}
])
Bạn chỉ có thể sử dụng các toán tử ngày tháng và tạo tài liệu như trong:
"day": {
"year": {"$year": "$date" },
"month": {"$month": "$date"},
"day": {"$dayOfYear": "$date"}
}
Điều đó cũng hoạt động tốt. Nhưng điều này mang lại cho bạn một chuỗi đẹp. Điều này sử dụng thực tế là $substr
sẽ truyền từ số nguyên sang chuỗi. Nếu điều đó được thêm vào tài liệu.
Xem Toán tử Ngày tài liệu hướng dẫn sử dụng các cách phân chia thời gian khác có thể được sử dụng cho các ngày.
Tốt hơn, hãy sử dụng toán học ngày để trả về Ngày BSON:
import datetime
db.test.aggregate([
{ "$group": {
"_id": {
"$add": [
{ "$subtract": [
{ "$subtract": [ "$date", datetime.datetime.utcfromtimestamp(0) ] },
{ "$mod": [
{ "$subtract": [ "$date", datetime.datetime.utcfromtimestamp(0) ] },
1000 * 60 * 60 * 24
]}
]},
datetime.datetime.utcfromtimestamp(0)
]
},
"count": { "$sum": 1 }
}},
{ "$sort": { "_id": 1 } }
])
Đây datetime.datetime.utcfromtimestamp(0)
sẽ được đưa vào đường ống dưới dạng Ngày BSON đại diện cho "kỷ nguyên". Khi bạn $subtract
một ngày BSON từ một ngày khác, sự khác biệt tính bằng mili giây được trả về. Điều này cho phép bạn "làm tròn" ngày thành ngày hiện tại bằng cách trừ đi $mod
kết quả để nhận được phần còn lại của sự chênh lệch mili giây so với một ngày.
Điều này cũng đúng với $add
trong đó "thêm" Ngày BSON vào một giá trị số sẽ dẫn đến Ngày BSON.