MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB $milliseconde

Dans MongoDB, le $millisecond l'opérateur de pipeline d'agrégation renvoie la partie milliseconde d'une date sous la forme d'un entier compris entre 0 et 999 .

Vous pouvez éventuellement spécifier un fuseau horaire à utiliser pour le résultat.

Le $millisecond L'opérateur accepte soit une date (sous forme de Date, d'horodatage ou d'ObjectId), soit un document qui spécifie la date et le fuseau horaire à utiliser.

Exemple

Supposons que nous ayons une collection appelée pets avec le document suivant :

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

Nous pouvons exécuter le code suivant pour extraire la portion milliseconde du born champ dans ce document.

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

Résultat :

{ "birthMilliSecond" : 123 }

Ici, j'ai utilisé birthMilliSecond comme nom de champ à renvoyer, mais cela aurait pu être n'importe quoi (comme milliSecondsAtBirth , milliSeconds , etc).

Le _id le champ est renvoyé par défaut lors de l'utilisation de projections dans MongoDB, mais dans cet exemple, j'ai explicitement caché le _id champ utilisant _id: 0 .

Spécifiez un fuseau horaire

Vous pouvez spécifier un fuseau horaire à utiliser pour la sortie du $millisecond opérateur.

Lorsque vous faites cela, l'argument est passé à $millisecond doit être de la forme suivante :

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

<dateExpression> est la date à utiliser, et <tzExpression> est le fuseau horaire à utiliser.

Le fuseau horaire peut être spécifié à l'aide de l'identifiant de fuseau horaire Olson (par exemple, "Europe/London" , "GMT" ) ou le décalage UTC (par exemple "+02:30" , "-1030" ).

Identifiant de fuseau horaire Olson

Voici un exemple qui génère les millisecondes dans deux fuseaux horaires différents, chacun utilisant les ID de fuseau horaire Olson :

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

Résultat :

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

Étant donné que le changement de fuseau horaire n'affecte pas la portion en millisecondes, le résultat est le même.

Décalage UTC

Dans cet exemple, nous utilisons le décalage 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" }
            }
        }
    }
  ]
)

Résultat :

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

Renvoyer les millisecondes d'un ObjectId

Vous pouvez utiliser $millisecond pour renvoyer la partie millisecondes d'un ObjectId.

Les valeurs ObjectId sont des valeurs hexadécimales de 12 octets qui se composent de :

  • Une valeur d'horodatage de 4 octets, représentant la création de l'ObjectId, mesurée en secondes depuis l'époque Unix.
  • A 5 octets est une valeur aléatoire
  • Un compteur incrémentant de 3 octets, initialisé à une valeur aléatoire.

Pour récapituler, notre document ressemble à ceci :

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

Ce document contient un ObjectId. On peut donc utiliser $millisecond pour renvoyer la portion en millisecondes de cet ObjectId.

Cependant, comme mentionné, la partie fuseau horaire de l'ObjectId n'est mesurée qu'en secondes depuis l'époque Unix, et par conséquent, elle n'inclut pas de partie en millisecondes.

Exemple :

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

Résultat :

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

Nous pouvons voir que l'horodatage n'inclut pas une portion de milliseconde, et le résultat est 0 .

Dans ce cas, j'ai également utilisé le $toDate opérateur de pipeline d'agrégation pour renvoyer la partie horodatage de l'ObjectId.