MongoDB-Aggregat innerhalb der täglichen Gruppierung
Ich habe einige Dokumente in Mongo, die ungefähr so aussehen:
{
_id : ObjectId("..."),
"make" : "Nissan",
..
},
{
_id : ObjectId("..."),
"make" : "Nissan",
"saleDate" : ISODate("2013-04-10T12:39:50.676Z"),
..
}
Im Idealfall möchte ich die Anzahl der pro Tag verkauften Fahrzeuge nach Marke ermitteln können. Ich möchte dann entweder heute oder in den letzten sieben Tagen ein Fenster wie das heutige ansehen.
Ich konnte die tägliche Ansicht mit etwas hässlichem Code erreichen
db.inventory.aggregate(
{ $match : { "saleDate" : { $gte: ISODate("2013-04-10T00:00:00.000Z"), $lt: ISODate("2013-04-11T00:00:00.000Z") } } } ,
{ $group : { _id : { make : "$make", saleDayOfMonth : { $dayOfMonth : "$saleDate" } }, cnt : { $sum : 1 } } }
)
Welches ergibt dann die Ergebnisse
{
"result" : [
{
"_id" : {
"make" : "Nissan",
"saleDayOfMonth" : 10
},
"cnt" : 2
},
{
"_id" : {
"make" : "Toyota",
"saleDayOfMonth" : 10
},
"cnt" : 4
},
],
"ok" : 1
}
Das ist also in Ordnung, aber ich würde es vorziehen, die beiden datetime-Werte in der Abfrage nicht ändern zu müssen. Dann möchte ich, wie oben erwähnt, in der Lage sein, diese Abfrage auszuführen (erneut, ohne sie jedes Mal ändern zu müssen) und die gleichen Ergebnisse nach Tag in der letzten Woche sortiert zu sehen.
Oh und hier sind die Beispieldaten, die ich für die Abfrage verwendet habe
db.inventory.save({"make" : "Nissan","saleDate" : ISODate("2013-04-10T12:39:50.676Z")});
db.inventory.save({"make" : "Nissan"});
db.inventory.save({"make" : "Nissan","saleDate" : ISODate("2013-04-10T11:39:50.676Z")});
db.inventory.save({"make" : "Toyota","saleDate" : ISODate("2013-04-09T11:39:50.676Z")});
db.inventory.save({"make" : "Toyota","saleDate" : ISODate("2013-04-10T11:38:50.676Z")});
db.inventory.save({"make" : "Toyota","saleDate" : ISODate("2013-04-10T11:37:50.676Z")});
db.inventory.save({"make" : "Toyota","saleDate" : ISODate("2013-04-10T11:36:50.676Z")});
db.inventory.save({"make" : "Toyota","saleDate" : ISODate("2013-04-10T11:35:50.676Z")});
Danke im Voraus, Kevin