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

MongoDB $ convertir

Dans MongoDB, vous pouvez utiliser le $convert opérateur de pipeline d'agrégation pour convertir une valeur en un type spécifié.

Vous pouvez convertir n'importe quelle expression valide en double, chaîne, ObjectId, booléen, date, entier, long ou décimal.

Tous les types ne peuvent pas être convertis en n'importe quel autre type. Certains types ne peuvent être convertis qu'à partir d'un sous-ensemble des types MongoDB disponibles. Par exemple, vous ne pouvez pas convertir une date en entier.

Vous pouvez éventuellement utiliser le onError paramètre pour spécifier ce qu'il faut renvoyer en cas d'erreur. Vous pouvez éventuellement utiliser le onNull paramètre pour spécifier ce qu'il faut renvoyer si la valeur d'entrée est nulle ou manquante.

Exemple de données

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

{ "_id" :ObjectId("6011e471c8eb4369cf6ad9d5"), "double" :123.75, "string" :"123", "boolean" :true, "date" :ISODate("2020-12-31T23:30 :15.123Z"), "integer" :123, "long" :NumberLong(123), "decimal" :NumberDecimal("123.75"), "datestring" :"2021-02-15 06:53:55"} 

Les exemples suivants montrent comment convertir chaque champ en d'autres types.

Convertir ObjectId en chaîne

Le _id champ dans le document ci-dessus est un ObjectId. Voici un exemple de conversion de l'ObjectId en chaîne.

db.samples.aggregate(
  [
    {
      $project:
        { 
          result: 
          {
            $convert: { 
              input: "$_id", 
              to: "string",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
).pretty() 

Résultat :

{ "_id" :ObjectId("6011e471c8eb4369cf6ad9d5"), "result" :"6011e471c8eb4369cf6ad9d5"}

Le résultat est que la chaîne hexadécimale de l'ObjectId est renvoyée sous forme de chaîne.

Convertir Double en Entier

Lorsque vous convertissez un double en entier, la valeur tronquée est renvoyée.

db.samples.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$double", 
              to: "int",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Résultat :

{ "résultat" :123 }

La valeur double tronquée doit être comprise entre les valeurs minimale et maximale d'un entier. Si ce n'est pas le cas, une erreur se produira.

De plus, vous ne pouvez pas convertir une valeur double dont la valeur tronquée est inférieure à la valeur entière minimale ou supérieure à la valeur entière maximale.

Convertir une chaîne en entier

Lorsque vous convertissez une chaîne en entier, $convert renvoie la valeur numérique de la chaîne sous forme d'entier.

db.samples.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$string", 
              to: "int",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Résultat :

{ "résultat" :123 }

La valeur de la chaîne doit être une base10 entier (par exemple "-123" , "123" ) et se situent entre les valeurs minimale et maximale pour un entier.

Convertir un booléen en entier

Lorsque vous convertissez un booléen en entier, $convert renvoie 1 pour une valeur booléenne de true , et 0 pour une valeur booléenne de false .

db.samples.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$boolean", 
              to: "int",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Résultat :

{ "résultat" :1 }

Convertir la date en chaîne

Vous pouvez utiliser $convert pour renvoyer une date sous forme de chaîne.

db.samples.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$date", 
              to: "string",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Résultat :

{ "résultat" :"2020-12-31T23:30:15.123Z" }

L'objet Date a été converti en chaîne.

Convertir Double en Date

Les types suivants peuvent être convertis en date :

  • doubler
  • décimal
  • longue
  • chaîne
  • ObjectId

Voici un exemple de conversion d'un double en date :

db.samples.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$double", 
              to: "date",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Résultat :

{ "result" :ISODate("1970-01-01T00:00:00.123Z") } 

Lorsque vous convertissez des nombres en une date, le nombre représente le nombre de millisecondes depuis le 1er janvier 1970.

Dans notre exemple, nous avons fourni une valeur double de 123 , qui a été interprété comme 123 millisecondes depuis le 1er janvier 1970.

Convertir un entier en décimal

Voici un exemple de conversion d'un entier en décimal :

db.samples.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$integer", 
              to: "decimal",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Résultat :

{ "result" :NumberDecimal("123.000000000000") } 

Convertir la chaîne en date

Voici un exemple de conversion d'une chaîne date/heure en objet Date :

db.samples.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$datestring", 
              to: "date",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Résultat :

{ "result" :ISODate("2021-02-15T06:53:55Z") } 

Lorsque vous convertissez une chaîne en objet Date, la chaîne doit être une chaîne de date valide, telle que :

  • 2021-02-15
  • 2021-02-15T06:53:55
  • 2021-02-15T06:53:55Z

Convertir en booléen

Lorsque vous convertissez une valeur en booléen, le résultat sera true ou false , en fonction de la valeur d'entrée.

Généralement, pour les valeurs numériques, cela renverra false si la valeur est zéro (0 ) et true pour toute autre valeur.

Pour les valeurs de chaîne, ObjectId et Date, il renverra toujours true .

db.samples.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$string", 
              to: "bool",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Résultat :

{ "résultat" :vrai }

Le onError Paramètre

Vous pouvez utiliser le onError paramètre pour renvoyer une valeur spécifiée en cas d'erreur.

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

{ "_id" :1, "name" :"Wag", "born" :"mars 2020", "weight" :null }

Vous trouverez ci-dessous un exemple d'essai de conversion qui échoue en raison d'une erreur. Dans le premier exemple, nous ne faisons pas utilisez onError .

db.dogs.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$born", 
              to: "int"
            }
          }
        }
    }
  ]
) 

Résultat :

Error: command failed: {
	"ok" : 0,
	"errmsg" : "Failed to parse number 'March 2020' in $convert with no onError value: Did not consume whole string.",
	"code" : 241,
	"codeName" : "ConversionFailure"
} : aggregate failed :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/assert.js:18:14
[email protected]/mongo/shell/assert.js:618:17
[email protected]/mongo/shell/assert.js:708:16
[email protected]/mongo/shell/db.js:266:5
[email protected]/mongo/shell/collection.js:1046:12
@(shell):1:1 

Cela a entraîné l'affichage d'un message d'erreur désagréable.

L'exemple suivant montre comment nous pouvons rendre cela plus agréable en utilisant le onError paramètre.

db.dogs.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$born", 
              to: "int",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Résultat :

{ "result" :"Une erreur s'est produite" }

Notez que nous recevons toujours le document renvoyé et que notre message d'erreur personnalisé s'affiche dans le champ.

Le onNull Paramètre

Vous pouvez éventuellement utiliser le onNull paramètre pour spécifier ce qu'il faut renvoyer si la valeur d'entrée est nulle ou manquante.

En utilisant le document précédent, nous pouvons tester le onNull paramètre comme celui-ci :

db.dogs.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$weight", 
              to: "decimal",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Résultat :

{ "result" :"L'entrée était nulle ou vide" }