Ya. Anda dapat menggunakan Operator Tanggal dengan $substr dan $concat untuk mengikat semuanya.
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 }}
])
Anda dapat menggunakan operator tanggal saja dan membuat dokumen seperti pada:
"day": {
"year": {"$year": "$date" },
"month": {"$month": "$date"},
"day": {"$dayOfYear": "$date"}
}
Itu bekerja dengan baik. Tapi ini memberi Anda string yang bagus. Ini memanfaatkan fakta bahwa $substr
akan dilemparkan dari integer ke string. Jika itu pernah ditambahkan ke dokumentasi.
Lihat Operator Tanggal dokumentasi untuk penggunaan pada pembagian waktu lain yang dapat digunakan pada tanggal.
Lebih baik lagi, gunakan matematika tanggal untuk mengembalikan Tanggal 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 } }
])
Di sini datetime.datetime.utcfromtimestamp(0)
akan dimasukkan ke dalam pipa sebagai Tanggal BSON yang mewakili "zaman". Saat Anda $subtract
satu Tanggal BSON dari yang lain perbedaan dalam milidetik dikembalikan. Ini memungkinkan Anda untuk "membulatkan" tanggal ke hari ini dengan mengurangi lagi $mod
hasil untuk mendapatkan sisa perbedaan milidetik dari satu hari.
Hal yang sama berlaku untuk $add
di mana "menambahkan" Tanggal BSON ke nilai numerik akan menghasilkan Tanggal BSON.