да Можете да използвате операторите за дата с $substr и $concat за да свържа всичко заедно.
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 }}
])
Можете да използвате само операторите за дата и да направите документ като в:
"day": {
"year": {"$year": "$date" },
"month": {"$month": "$date"},
"day": {"$dayOfYear": "$date"}
}
Това работи също толкова добре. Но това ви дава хубав низ. Това използва факта, че $substr
ще прехвърли от цяло число към низ. Ако това някога бъде добавено към документацията.
Погледнете операторите за дата документация за използване на други времеви разделения, които могат да се използват за дати.
Още по-добре използвайте математика за дата, за да върнете 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 } }
])
Тук datetime.datetime.utcfromtimestamp(0)код>
ще бъде подаден в тръбопровода като BSON дата, представляваща "епоха". Когато $subtract
една BSON дата от друга се връща разликата в милисекунди. Това ви позволява да „закръглите“ датата до текущия ден, като отново извадите $mod
резултат, за да получите остатъка от милисекунди разлика от ден.
Същото важи и за $add
където "добавянето" на BSON дата към числова стойност ще доведе до BSON дата.