sql >> Databasteknik >  >> NoSQL >> MongoDB

pymongo-grupp efter datum och tid

Ja. Du kan använda Datumoperatörer med $substr och $concat att knyta ihop allt.

db.test.aggregate([
    {"$group": {
        "_id" : { "$concat": [
            {"$substr": [{"$year": "$date"}, 0, 4 ]},
            "-",
            {"$substr": [{"$month": "$date"}, 0, 2 ]},
            "-",
            {"$substr": [{"$dayOfMonth": "$date"}, 0, 2 ]},
        ]},
        "count": {"$sum": 1 }
     }},
     {"$sort": { "_id": 1 }}
])

Du kan bara använda datumoperatorerna och skapa ett dokument som i:

"day": { 
    "year": {"$year": "$date" },
   "month": {"$month": "$date"}, 
   "day": {"$dayOfYear": "$date"}
}

Det fungerar lika bra. Men detta ger dig ett fint snöre. Detta utnyttjar det faktum att $substr kommer att kasta från heltal till sträng. Om det någonsin läggs till i dokumentationen.

Titta på Datumoperatörer dokumentation för användning på andra tidsindelningar som kan användas på datum.

Ännu bättre, använd date math för att returnera ett BSON-datum:

import datetime

db.test.aggregate([
    { "$group": {
        "_id": {
            "$add": [
               { "$subtract": [
                   { "$subtract": [ "$date", datetime.datetime.utcfromtimestamp(0) ] },
                   { "$mod": [
                       { "$subtract": [ "$date", datetime.datetime.utcfromtimestamp(0) ] },
                       1000 * 60 * 60 * 24
                   ]}
               ]},
               datetime.datetime.utcfromtimestamp(0)
           ]
        },
        "count": { "$sum": 1 }
    }},
    { "$sort": { "_id": 1 } }
])

Här datetime.datetime.utcfromtimestamp(0) kommer att matas in i pipelinen som ett BSON-datum som representerar "epok". När du $subtract ett BSON-datum från ett annat, skillnaden i millisekunder returneras. Detta gör att du kan "runda" datumet till den aktuella dagen genom att återigen subtrahera $mod resultat för att få resten av millisekunders skillnad från en dag.

Detsamma gäller för $add där att "lägga till" ett BSON-datum till ett numeriskt värde kommer att resultera i ett BSON-datum.




  1. Kan inte få mongoid att fungera med Rails 4

  2. Varför väntar detta utanför async-funktionen?

  3. MongoDB $in Query Operator

  4. Django serialisering till JSON-fel:'MetaDict'-objektet har inget attribut 'concrete_model'