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> }
Où <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.