Agregacja MongoDB w ramach grupowania dziennego

Mam kilka dokumentów w mongo, które wyglądają mniej więcej tak:

{
  _id : ObjectId("..."),
  "make" : "Nissan",
  ..
},
{
  _id : ObjectId("..."),
  "make" : "Nissan",
  "saleDate" :  ISODate("2013-04-10T12:39:50.676Z"),
  ..
}

Najlepiej byłoby móc policzyć, według marki, liczbę sprzedanych pojazdów dziennie. Chciałbym wtedy zobaczyć albo dzisiaj, albo okno takie jak dzisiaj przez ostatnie siedem dni.

Udało mi się wykonać codzienny widok za pomocą jakiegoś brzydkiego kodu

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 } } }
)

Który następnie daje wyniki

{
  "result" : [
    {
      "_id" : {
        "make" : "Nissan",
        "saleDayOfMonth" : 10
      },
      "cnt" : 2
    },
    {
      "_id" : {
        "make" : "Toyota",
        "saleDayOfMonth" : 10
      },
      "cnt" : 4
    },
  ],
  "ok" : 1
}

To jest w porządku, ale wolałbym nie zmieniać dwóch wartości datetime w zapytaniu. Następnie, jak wspomniałem powyżej, chciałbym móc uruchomić to zapytanie (ponownie, bez konieczności modyfikowania go za każdym razem) i zobaczyć te same wyniki skumulowane według dnia w ciągu ostatniego tygodnia.

A oto przykładowe dane, których używam do zapytania

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")});

Z góry dziękuję, Kevin

questionAnswers(3)

yourAnswerToTheQuestion