sql >> Databasteknik >  >> NoSQL >> MongoDB

gruppera efter datum i mongodb

Nytt svar med Mongo aggregeringsramverk

Efter att denna fråga ställts och besvarats släppte 10gen Mongodb version 2.2 med ett aggregeringsramverk, vilket nu är det bättre sättet att göra den här typen av frågor. Den här frågan är lite utmanande eftersom du vill gruppera efter datum och de lagrade värdena är tidsstämplar, så du måste göra något för att konvertera tidsstämplarna till datum som matchar. Som exempel kommer jag bara att skriva en fråga som får rätt antal.

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

Detta kommer att returnera något i stil med:

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

Du måste använda $match för att begränsa frågan till det datumintervall du är intresserad av och $project för att byta namn på _id till date . Hur du omvandlar dagen på året tillbaka till ett datum lämnas som en övning för läsaren. :-)

10gen har ett praktiskt konverteringsdiagram för SQL till Mongo Aggregation värt att bokmärka. Det finns också en specifik artikel om operatörer för datumaggregation.

Om du blir lite finare kan du använda:

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

vilket ger dig de senaste 15 dagarna och returnerar en viss datetime inom varje dag i date fält. Till exempel:

[
    {
        "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. Vad är tcp-backlog i redis.conf

  2. redis timeout för anslutning till fjärrserver i en dockare

  3. Mongoose - Spara en rad strängar

  4. Åtkomst till MongoDB från Go