Dans MongoDB, le $log
L'opérateur de pipeline d'agrégation calcule le log d'un nombre dans la base spécifiée et renvoie le résultat sous la forme d'un double.
Syntaxe
La syntaxe ressemble à ceci :
{ $log: [ <number>, <base> ] }
Où :
<number>
peut être n'importe quelle expression valide qui se résout en un nombre non négatif.<base>
peut être n'importe quelle expression valide qui se résout en un nombre positif supérieur à1
.
Exemple
Supposons que nous ayons une collection appelée test
avec le document suivant :
{ "_id" : 1, "data" : 0.5 } { "_id" : 2, "data" : 20 } { "_id" : 3, "data" : 200 }
Nous pouvons utiliser le $log
opérateur pour retourner le log base 10 des data
champ :
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $log: [ "$data", 10 ] }
}
}
]
)
Résultat :
{ "data" : 0.5, "result" : -0.30102999566398114 } { "data" : 20, "result" : 1.301029995663981 } { "data" : 200, "result" : 2.301029995663981 }
Une autre façon de faire cela aurait été d'utiliser le $log10
opérateur.
Cependant, $log10
renvoie uniquement le log base 10 d'un nombre. Avec $log
, en revanche, on peut préciser la base à utiliser.
Voici un exemple de spécification d'une base de 16 :
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $log: [ "$data", 16 ] }
}
}
]
)
Résultat :
{ "data" : 0.5, "result" : -0.25 } { "data" : 20, "result" : 1.0804820237218407 } { "data" : 200, "result" : 1.910964047443681 }
Logarithme naturel
Le logarithme naturel d'un nombre est son logarithme à la base de la constante mathématique e , où e est un nombre irrationnel et transcendantal qui commence par 2,7182818284590452353602874713527 et continue indéfiniment.
La constante mathématique e est également connu sous le nom de nombre d'Euler.
En JavaScript, nous pouvons utiliser Math.E
représenter e . On peut donc obtenir le logarithme naturel d'un nombre en utilisant Math.E
comme deuxième argument lors de l'utilisation de $log
.
Exemple :
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $log: [ "$data", Math.E ] }
}
}
]
)
Résultat :
{ "data" : 0.5, "result" : -0.6931471805599453 } { "data" : 20, "result" : 2.995732273553991 } { "data" : 200, "result" : 5.298317366548036 }
Gardez à l'esprit que MongoDB a également le $ln
, qui est spécifiquement conçu pour renvoyer le logarithme naturel d'un nombre, vous trouverez donc peut-être plus facile d'utiliser cet opérateur à la place. Voir MongoDB $ln
pour un exemple.
Valeurs hors plage
Comme mentionné, le $log
L'opérateur accepte toute expression valide qui se résout en un nombre non négatif. Les valeurs en dehors de cette plage entraîneront une erreur.
Supposons que nous ajoutions le document suivant à notre collection :
{ "_id" : 4, "data" : -20 }
Exécutons le $log
opérateur sur ce document :
db.test.aggregate(
[
{ $match: { _id: { $in: [ 4 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $log: [ "$data", 16 ] }
}
}
]
)
Résultat :
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$log's argument must be a positive number, but is -20", "code" : 28758, "codeName" : "Location28758" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:639:17 [email protected]/mongo/shell/assert.js:729:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1058:12 @(shell):1:1
Type de données incorrect
Fournir le mauvais type de données entraînera également une erreur.
Supposons que nous ajoutions le document suivant à notre collection :
{ "_id" : 5, "data" : "Ten" }
Exécutons le $log
opérateur sur ce document :
db.test.aggregate(
[
{ $match: { _id: { $in: [ 5 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $log: [ "$data", 16 ] }
}
}
]
)
Résultat :
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$log's argument must be numeric, not string", "code" : 28756, "codeName" : "Location28756" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:639:17 [email protected]/mongo/shell/assert.js:729:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1058:12 @(shell):1:1
Nous avons fourni une chaîne, et donc le message d'erreur nous indique que l'argument de $log's argument must be numeric, not string
.
Valeurs nulles
Les valeurs nulles renvoient null
lors de l'utilisation du $log
opérateur.
Supposons que nous ajoutions le document suivant à notre collection :
{ "_id" : 6, "data" : null }
Exécutons le $log
opérateur sur ce document :
db.test.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $log: [ "$data", 16 ] }
}
}
]
)
Résultat :
{ "data" : null, "result" : null }
Nous pouvons voir que le résultat est null
.
Valeurs NaN
Si l'argument se résout en NaN
, $log
renvoie NaN
.
Exemple :
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $log: [ "$data" * 1, 16 ] }
}
}
]
)
Résultat :
{ "data" : 0.5, "result" : NaN }
Champs inexistants
Si le $log
l'opérateur est appliqué sur un champ qui n'existe pas, null
est renvoyé.
Exemple :
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $log: [ "$age", 16 ] }
}
}
]
)
Résultat :
{ "data" : 0.5, "result" : null }
Dans ce cas, nous avons essayé d'appliquer $log
contre un champ appelé age
, mais ce champ n'existe pas dans le document, et nous obtenons donc null
.