Oui. Vous pouvez utiliser les Opérateurs de date avec $substr et $concat pour lier le tout.
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 }}
])
Vous pouvez utiliser uniquement les opérateurs de date et créer un document comme dans :
"day": {
"year": {"$year": "$date" },
"month": {"$month": "$date"},
"day": {"$dayOfYear": "$date"}
}
Cela fonctionne aussi bien. Mais cela vous donne une belle chaîne. Cela utilise le fait que $substr
convertira d'entier en chaîne. Si jamais cela est ajouté à la documentation.
Regardez les Opérateurs de date documentation à utiliser sur les autres divisions horaires pouvant être utilisées sur les dates.
Mieux encore, utilisez les calculs de date pour renvoyer une date 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 } }
])
Ici datetime.datetime.utcfromtimestamp(0)
sera introduit dans le pipeline en tant que date BSON représentant "l'époque". Lorsque vous $subtract
une date BSON d'une autre, la différence en millisecondes est renvoyée. Cela vous permet "d'arrondir" la date au jour actuel en soustrayant à nouveau le $mod
résultat pour obtenir le reste de millisecondes de différence par rapport à un jour.
Il en va de même pour $add
où "ajouter" une date BSON à une valeur numérique donnera une date BSON.