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.