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

Antworten auf die Frage(3)

Ihre Antwort auf die Frage