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

MongoDB $ millisecondi

In MongoDB, il $millisecond l'operatore della pipeline di aggregazione restituisce la parte in millisecondi di una data come numero intero compreso tra 0 e 999 .

Puoi facoltativamente specificare un fuso orario da utilizzare per il risultato.

Il $millisecond operatore accetta una data (come una data, un timestamp o un ObjectId) o un documento che specifica la data e il fuso orario da utilizzare.

Esempio

Supponiamo di avere una collezione chiamata pets con il seguente documento:

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

Possiamo eseguire il codice seguente per estrarre la porzione di millisecondi da born campo in quel documento.

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

Risultato:

{ "birthMilliSecond" : 123 }

Qui ho usato birthMilliSecond come nome del campo da restituire, ma potrebbe essere qualsiasi cosa (come milliSecondsAtBirth , milliSeconds , eccetera).

Il _id il campo viene restituito per impostazione predefinita quando si utilizzano le proiezioni in MongoDB, ma in questo esempio ho nascosto esplicitamente _id campo utilizzando _id: 0 .

Specifica un fuso orario

Puoi specificare un fuso orario da utilizzare per l'output di $millisecond operatore.

Quando lo fai, l'argomento passa a $millisecond deve essere della seguente forma:

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

Dove <dateExpression> è la data da utilizzare e <tzExpression> è il fuso orario da utilizzare.

Il fuso orario può essere specificato utilizzando l'identificatore del fuso orario Olson (ad es. "Europe/London" , "GMT" ) o l'offset UTC (ad es. "+02:30" , "-1030" ).

Identificatore di fuso orario Olson

Ecco un esempio che restituisce i millisecondi in due fusi orari diversi, ciascuno dei quali utilizza gli ID fuso orario Olson:

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

Risultato:

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

Dato che la modifica del fuso orario non influisce sulla parte dei millisecondi, il risultato è lo stesso.

Offset UTC

In questo esempio utilizziamo l'offset UTC.

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

Risultato:

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

Restituisce i millisecondi da un ObjectId

Puoi usare $millisecond per restituire la parte in millisecondi da un ObjectId.

I valori ObjectId sono valori esadecimali a 12 byte costituiti da:

  • Un valore di timestamp di 4 byte, che rappresenta la creazione dell'ObjectId, misurato in secondi dall'epoca di Unix.
  • Un 5 byte è un valore casuale
  • Un contatore incrementale di 3 byte, inizializzato su un valore casuale.

Per ricapitolare, il nostro documento si presenta così:

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

Questo documento contiene un ObjectId. Possiamo quindi usare $millisecond per restituire la porzione di millisecondi da quell'ObjectId.

Tuttavia, come accennato, la parte del fuso orario di ObjectId viene misurata solo in secondi dall'epoca di Unix e, pertanto, non include una parte di millisecondi.

Esempio:

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

Risultato:

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

Possiamo vedere che il timestamp non include una porzione di millisecondi e il risultato è 0 .

In questo caso, ho utilizzato anche $toDate operatore della pipeline di aggregazione per restituire la parte timestamp di ObjectId.