sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB $milisegundo

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.