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

MongoDB $Millisekunde

In MongoDB die $millisecond Der Aggregations-Pipeline-Operator gibt den Millisekundenteil eines Datums als ganze Zahl zwischen 0 zurück und 999 .

Sie können optional eine Zeitzone angeben, die für das Ergebnis verwendet werden soll.

Die $millisecond -Operator akzeptiert entweder ein Datum (entweder als Date, Timestamp oder ObjectId) oder ein Dokument, das das zu verwendende Datum und die zu verwendende Zeitzone angibt.

Beispiel

Angenommen, wir haben eine Sammlung namens pets mit folgendem Dokument:

{
	"_id" : ObjectId("600631c7c8eb4369cf6ad9c8"),
	"name" : "Fetch",
	"born" : ISODate("2020-12-31T23:30:15.123Z")
}

Wir können den folgenden Code ausführen, um den Millisekundenteil aus born zu extrahieren Feld in diesem Dokument.

db.pets.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthMilliSecond: { $millisecond: "$born" }
        }
    }
  ]
)

Ergebnis:

{ "birthMilliSecond" : 123 }

Hier habe ich birthMilliSecond verwendet als zurückzugebender Feldname, aber das hätte alles sein können (wie milliSecondsAtBirth , milliSeconds , etc).

Die _id Das Feld wird standardmäßig zurückgegeben, wenn Projektionen in MongoDB verwendet werden, aber in diesem Beispiel habe ich die _id explizit ausgeblendet Feld mit _id: 0 .

Geben Sie eine Zeitzone an

Sie können eine Zeitzone angeben, die für die Ausgabe von $millisecond verwendet werden soll Betreiber.

Wenn Sie dies tun, wird das Argument an $millisecond übergeben muss folgende Form haben:

{ date: <dateExpression>, timezone: <tzExpression> }

Wobei <dateExpression> ist das zu verwendende Datum und <tzExpression> ist die zu verwendende Zeitzone.

Die Zeitzone kann entweder mit der Olson-Zeitzonenkennung (z. B. "Europe/London" , "GMT" ) oder den UTC-Offset (z. B. "+02:30"). , "-1030" ).

Olson-Zeitzonenkennung

Hier ist ein Beispiel, das die Millisekunden in zwei verschiedenen Zeitzonen ausgibt, die jeweils die Olson-Zeitzonen-IDs verwenden:

db.pets.aggregate(
  [
    {
      $project: {
          _id: 0,
          kabul: { 
            $millisecond: { date: "$born", timezone: "Asia/Kabul" }
            },
          brisbane: { 
            $millisecond: { date: "$born", timezone: "Australia/Brisbane" }
            }
        }
    }
  ]
)

Ergebnis:

{ "kabul" : 123, "brisbane" : 123 } 

Da sich die Änderung der Zeitzone nicht auf den Teil der Millisekunden auswirkt, ist das Ergebnis dasselbe.

UTC-Offset

In diesem Beispiel verwenden wir den UTC-Offset.

db.pets.aggregate(
  [
    {
      $project: {
          _id: 0,
          "utcOffset+04:30": { 
            $millisecond: { date: "$born", timezone: "+04:30" }
            },
          "utcOffset+05:45": { 
            $millisecond: { date: "$born", timezone: "+05:45" }
            }
        }
    }
  ]
)

Ergebnis:

{ "utcOffset+04:30" : 123, "utcOffset+05:45" : 123 }

Gib die Millisekunden von einer ObjectId zurück

Sie können $millisecond verwenden um den Millisekundenteil von einer ObjectId zurückzugeben.

ObjectId-Werte sind 12-Byte-Hexadezimalwerte, die aus Folgendem bestehen:

  • Ein 4-Byte-Zeitstempelwert, der die Erstellung der ObjectId darstellt, gemessen in Sekunden seit der Unix-Epoche.
  • Ein 5 Byte ist ein Zufallswert
  • Ein 3-Byte-Zähler, der auf einen zufälligen Wert initialisiert wird.

Zusammenfassend sieht unser Dokument so aus:

{
	"_id" : ObjectId("600631c7c8eb4369cf6ad9c8"),
	"name" : "Fetch",
	"born" : ISODate("2020-12-31T23:30:15.123Z")
}

Dieses Dokument enthält eine ObjectId. Wir können daher $millisecond verwenden um den Millisekundenteil von dieser ObjectId zurückzugeben.

Wie bereits erwähnt, wird der Zeitzonenteil der ObjectId jedoch nur in Sekunden seit der Unix-Epoche gemessen und enthält daher keinen Millisekundenteil.

Beispiel:

db.pets.aggregate(
  [
    {
      $project:
        {
          "timeStamp": { $toDate: "$_id"},
          "millisecond": { $millisecond: "$_id" }
        }
    }
  ]
).pretty()

Ergebnis:

{
	"_id" : ObjectId("600631c7c8eb4369cf6ad9c8"),
	"timeStamp" : ISODate("2021-01-19T01:11:35Z"),
	"millisecond" : 0
}

Wir können sehen, dass der Zeitstempel keinen Millisekundenteil enthält und das Ergebnis 0 ist .

In diesem Fall habe ich auch den $toDate verwendet Aggregations-Pipeline-Operator, um den Zeitstempelteil der ObjectId zurückzugeben.