En MongoDB, el $millisecond
El operador de canalización de agregación devuelve la porción de milisegundos de una fecha como un número entero entre 0
y 999
.
Opcionalmente, puede especificar una zona horaria para usar para el resultado.
El $millisecond
El operador acepta una fecha (como una fecha, una marca de tiempo o un Id. de objeto) o un documento que especifica la fecha y la zona horaria a utilizar.
Ejemplo
Supongamos que tenemos una colección llamada pets
con el siguiente documento:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "name" : "Fetch", "born" : ISODate("2020-12-31T23:30:15.123Z") }
Podemos ejecutar el siguiente código para extraer la porción de milisegundos del born
campo en ese documento.
db.pets.aggregate(
[
{
$project:
{
_id: 0,
birthMilliSecond: { $millisecond: "$born" }
}
}
]
)
Resultado:
{ "birthMilliSecond" : 123 }
Aquí, usé birthMilliSecond
como el nombre del campo a devolver, pero podría haber sido cualquier cosa (como milliSecondsAtBirth
, milliSeconds
, etc).
El _id
El campo se devuelve de forma predeterminada cuando se usan proyecciones en MongoDB, pero en este ejemplo oculté explícitamente el _id
campo usando _id: 0
.
Especifique una zona horaria
Puede especificar una zona horaria para usar para la salida de $millisecond
operador.
Cuando haces esto, el argumento pasa a $millisecond
debe ser de la siguiente forma:
{ date: <dateExpression>, timezone: <tzExpression> }
Donde <dateExpression>
es la fecha a usar, y <tzExpression>
es la zona horaria a utilizar.
La zona horaria se puede especificar utilizando el identificador de zona horaria de Olson (por ejemplo, "Europe/London"
, "GMT"
) o el desplazamiento UTC (por ejemplo, "+02:30"
, "-1030"
).
Identificador de zona horaria de Olson
Aquí hay un ejemplo que genera los milisegundos en dos zonas horarias diferentes, cada una con los ID de zona horaria de Olson:
db.pets.aggregate(
[
{
$project: {
_id: 0,
kabul: {
$millisecond: { date: "$born", timezone: "Asia/Kabul" }
},
brisbane: {
$millisecond: { date: "$born", timezone: "Australia/Brisbane" }
}
}
}
]
)
Resultado:
{ "kabul" : 123, "brisbane" : 123 }
Dado que el cambio de zona horaria no afecta la porción de milisegundos, el resultado es el mismo.
Desplazamiento UTC
En este ejemplo usamos el desplazamiento 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" }
}
}
}
]
)
Resultado:
{ "utcOffset+04:30" : 123, "utcOffset+05:45" : 123 }
Devolver los milisegundos de un ObjectId
Puedes usar $millisecond
para devolver la porción de milisegundos de un ObjectId.
Los valores de ObjectId son valores hexadecimales de 12 bytes que constan de:
- Un valor de marca de tiempo de 4 bytes, que representa la creación del ObjectId, medido en segundos desde la época de Unix.
- Un byte de 5 es un valor aleatorio
- Un contador incremental de 3 bytes, inicializado a un valor aleatorio.
En resumen, nuestro documento se ve así:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "name" : "Fetch", "born" : ISODate("2020-12-31T23:30:15.123Z") }
Este documento contiene un ObjectId. Por lo tanto, podemos usar $millisecond
para devolver la porción de milisegundos de ese ObjectId.
Sin embargo, como se mencionó, la parte de la zona horaria del ObjectId solo se mide en segundos desde la época de Unix y, por lo tanto, no incluye una parte de milisegundos.
Ejemplo:
db.pets.aggregate(
[
{
$project:
{
"timeStamp": { $toDate: "$_id"},
"millisecond": { $millisecond: "$_id" }
}
}
]
).pretty()
Resultado:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "timeStamp" : ISODate("2021-01-19T01:11:35Z"), "millisecond" : 0 }
Podemos ver que la marca de tiempo no incluye una porción de milisegundos y el resultado es 0
.
En este caso, también usé el $toDate
operador de canalización de agregación para devolver la parte de la marca de tiempo del ObjectId.