sql >> Database teknologi >  >> NoSQL >> MongoDB

Få unix-tidsstempel på sekunder ud af MongoDB ISODate under aggregering

Jeg er ikke sikker på, hvorfor du tror, ​​du har brug for værdien i sekunder i stedet for millisekunder, da begge former generelt er gyldige, og inden for de fleste sprogimplementeringer foretrækkes millisekunderne faktisk. Men generelt set, at prøve at tvinge dette til en streng er den forkerte måde at omgå dette på, og generelt gør du bare regnestykket:

db.data.aggregate([
  { "$project": {
    "timestamp": {
      "$subtract": [
        { "$divide": [
            { "$subtract": [ "$md", new Date("1970-01-01") ] },
            1000
        ]},
        { "$mod": [
          { "$divide": [
              { "$subtract": [ "$md", new Date("1970-01-01") ] },
              1000
          ]},
          1
        ]}
      ]
    }
  }}
])

Hvilket giver dig et epoketidsstempel på få sekunder. Grundlæggende afledt af, når et BSON-datoobjekt trækkes fra et andet, så er resultatet tidsintervallet i millisekunder. Brug af den indledende epokedato "1970-01-01" resulterer i det væsentlige i at udtrække millisekunderværdien fra den aktuelle datoværdi. $divide operatoren fjerner i det væsentlige millisekunderdelen og $mod udfører modulo for at implementere afrunding.

Virkelig selvom du er bedre stillet at udføre arbejdet på modersmålet til din applikation, da alle BSON-datoer vil blive returneret der som en indbygget "dato/datotid"-type, hvor du kan udtrække tidsstempelværdien. Overvej det grundlæggende JavaScript i skallen:

var date = new Date()
( date.valueOf() / 1000 ) - ( ( date.valueOf() / 1000 ) % 1 )

Typisk med aggregering ønsker du at lave denne form for "matematik" til en tidsstempelværdi til brug i noget som at aggregere værdier inden for en tidsperiode som f.eks. en dag. Der er datooperatorer tilgængelige for aggregeringsrammen, men du kan også gøre det på den matematiske måde:

db.data.aggregate([
    { "$group": {
        "_id": {
          "$subtract": [
              { "$subtract": [ "$md", new Date("1970-01-01") ] },
              { "$mod": [
                  { "$subtract": [ "$md", new Date("1970-01-01") ] },
                  1000 * 60 * 60 * 24
              ]}
          ]
        },
        "count": { "$sum": 1 }
    }}
])

Denne form ville være mere typisk at udsende et tidsstempel afrundet til en dag og aggregere resultaterne inden for disse intervaller.

Så dit formål med aggregeringsrammen bare for at udtrække et tidsstempel ser ikke ud til at være den bedste brug, eller det burde faktisk ikke være nødvendigt at konvertere dette til sekunder i stedet for millisekunder. I din ansøgningskode er det, hvor jeg synes, du skal gøre det, medmindre du selvfølgelig ønsker resultater for tidsintervaller, hvor du kan anvende datomatematikken som vist.

Metoderne er der, men medmindre du faktisk samler, ville dette være den dårligste ydeevne for din applikation. Foretag konverteringen i kode i stedet.




  1. Redis aktiv-aktiv replikation

  2. Hvordan bruger man MongoDB med løfter i Node.js?

  3. Hvordan fjerner jeg fastsiddende/forældede Resque-arbejdere?

  4. Hvordan installeres tidligere version af mongodb med homebrew?