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

MongoDB $log

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 .