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

Abrufen des Unix-Zeitstempels in Sekunden aus MongoDB ISODate während der Aggregation

Ich bin mir nicht sicher, warum Sie glauben, dass Sie den Wert in Sekunden und nicht in Millisekunden benötigen, da im Allgemeinen beide Formen gültig sind und in den meisten Sprachimplementierungen die Millisekunden tatsächlich bevorzugt werden. Aber im Allgemeinen ist der Versuch, dies in eine Zeichenfolge zu zwingen, der falsche Weg, dies zu umgehen, und im Allgemeinen rechnen Sie einfach nach:

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

Was Ihnen einen Epochenzeitstempel in Sekunden zurückgibt. Grundsätzlich abgeleitet, wenn ein BSON-Datumsobjekt von einem anderen subtrahiert wird, ist das Ergebnis das Zeitintervall in Millisekunden. Die Verwendung des anfänglichen Epochendatums „1970-01-01“ führt im Wesentlichen zum Extrahieren des Millisekundenwerts aus dem aktuellen Datumswert. Die $divide Der Operator entfernt im Wesentlichen den Teil der Millisekunden und den $mod führt das Modulo aus, um das Runden zu implementieren.

Wirklich, aber Sie sind besser dran, die Arbeit in der Muttersprache für Ihre Anwendung zu erledigen, da alle BSON-Daten dort als nativer "date/datetime"-Typ zurückgegeben werden, wo Sie den Zeitstempelwert extrahieren können. Betrachten Sie die JavaScript-Grundlagen in der Shell:

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

Typischerweise möchten Sie bei der Aggregation diese Art von "Mathematik" mit einem Zeitstempelwert durchführen, um ihn beispielsweise zum Aggregieren von Werten innerhalb eines Zeitraums wie einem Tag zu verwenden. Für das Aggregations-Framework stehen Datumsoperatoren zur Verfügung, aber Sie können dies auch auf mathematische Weise tun:

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

Dieses Formular würde eher einen auf einen Tag gerundeten Zeitstempel ausgeben und die Ergebnisse innerhalb dieser Intervalle aggregieren.

Ihr Zweck des Aggregationsframeworks, nur um einen Zeitstempel zu extrahieren, scheint also nicht die beste Verwendung zu sein, oder es sollte tatsächlich nicht notwendig sein, dies in Sekunden anstatt in Millisekunden umzuwandeln. In Ihrem Anwendungscode sollten Sie das meiner Meinung nach tun, es sei denn, Sie möchten tatsächlich Ergebnisse für Zeitintervalle, in denen Sie die Datumsmathematik wie gezeigt anwenden können.

Die Methoden sind vorhanden, aber wenn Sie nicht tatsächlich aggregieren, wäre dies die schlechteste Leistungsoption für Ihre Anwendung. Führen Sie die Konvertierung stattdessen im Code durch.