MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Gruppieren nach Daten in Mongodb

Neue Antwort unter Verwendung des Mongo-Aggregationsframeworks

Nachdem diese Frage gestellt und beantwortet wurde, veröffentlichte 10gen Mongodb Version 2.2 mit einem Aggregations-Framework, das nun der bessere Weg ist, um diese Art von Abfrage durchzuführen. Diese Abfrage ist ein wenig schwierig, da Sie nach Datum gruppieren möchten und die gespeicherten Werte Zeitstempel sind. Sie müssen also etwas tun, um die Zeitstempel in übereinstimmende Daten umzuwandeln. Als Beispiel werde ich nur eine Abfrage schreiben, die die richtigen Zählwerte erhält.

db.col.aggregate(
   { $group: { _id: { $dayOfYear: "$date"},
               click: { $sum: 1 } } }
   )

Dies gibt etwas zurück wie:

[
    {
        "_id" : 144,
        "click" : 165
    },
    {
        "_id" : 275,
        "click" : 12
    }
]

Sie müssen $match verwenden um die Abfrage auf den Datumsbereich zu beschränken, an dem Sie interessiert sind, und $project um _id umzubenennen bis date . Wie Sie den Tag des Jahres wieder in ein Datum umwandeln, bleibt dem Leser als Übung überlassen. :-)

10gen hat ein praktisches Umrechnungsdiagramm für die SQL-zu-Mongo-Aggregation, das es wert ist, mit einem Lesezeichen versehen zu werden. Es gibt auch einen speziellen Artikel über Datumsaggregationsoperatoren.

Wenn Sie ein wenig ausgefallener werden, können Sie Folgendes verwenden:

db.col.aggregate([
  { $group: {
      _id: {
        $add: [
         { $dayOfYear: "$date"}, 
         { $multiply: 
           [400, {$year: "$date"}]
         }
      ]},   
      click: { $sum: 1 },
      first: {$min: "$date"}
    }
  },
  { $sort: {_id: -1} },
  { $limit: 15 },
  { $project: { date: "$first", click: 1, _id: 0} }
])

Dadurch erhalten Sie die letzten 15 Tage und geben einige Datums- und Uhrzeitangaben innerhalb jedes Tages im date zurück Feld. Zum Beispiel:

[
    {
        "click" : 431,
        "date" : ISODate("2013-05-11T02:33:45.526Z")
    },
    {
        "click" : 702,
        "date" : ISODate("2013-05-08T02:11:00.503Z")
    },
            ...
    {
        "click" : 814,
        "date" : ISODate("2013-04-25T00:41:45.046Z")
    }
]