sql >> Database >  >> NoSQL >> MongoDB

groeperen op datums in mongodb

Nieuw antwoord met Mongo-aggregatieraamwerk

Nadat deze vraag was gesteld en beantwoord, bracht 10gen Mongodb versie 2.2 uit met een aggregatieraamwerk, wat nu de betere manier is om dit soort zoekopdrachten uit te voeren. Deze query is een beetje uitdagend omdat je op datum wilt groeperen en de opgeslagen waarden tijdstempels zijn, dus je moet iets doen om de tijdstempels te converteren naar datums die overeenkomen. Voor de doeleinden van het voorbeeld zal ik gewoon een query schrijven die de juiste tellingen krijgt.

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

Dit geeft iets terug als:

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

Je moet $match . gebruiken om de zoekopdracht te beperken tot de periode waarin u geïnteresseerd bent en $project om _id te hernoemen tot date . Hoe je de dag van het jaar terug naar een datum converteert, blijft een oefening voor de lezer. :-)

10gen heeft een handige conversietabel van SQL naar Mongo Aggregation die het waard is om te bookmarken. Er is ook een specifiek artikel over operatoren voor datumaggregatie.

Om een ​​beetje liefhebber te worden, kunt u het volgende gebruiken:

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

waarmee je de laatste 15 dagen krijgt en binnen elke dag wat datetime teruggeeft in de date veld. Bijvoorbeeld:

[
    {
        "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")
    }
]


  1. Redis pub/sub op rails

  2. MongoDB:alleen documenten ophalen die in de afgelopen 24 uur zijn gemaakt?

  3. MongoDB bewaken met Prometheus &ClusterControl

  4. Bestand doorgeven aan actieve taak / achtergrondtaak