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

MongoDB $trim

Dans MongoDB, le $trim L'opérateur de pipeline d'agrégation supprime les espaces au début et à la fin d'une chaîne. Cela inclut le caractère nul.

Il peut également supprimer tout caractère spécifié. Par exemple, vous pouvez l'utiliser pour supprimer tous les traits d'union (- ) ou des points (. ) ou tous les s caractères, etc.

Exemple

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

{ "_id" : 1, "name" : "Wagg", "type" : " Dog    ", "weight" : 20 }

Nous pouvons voir que le type le champ inclut un espace blanc des deux côtés du mot Dog . Nous pouvons utiliser le $trim opérateur pour renvoyer ce champ sans l'espace blanc.

Exemple :

db.pets.aggregate([
  { 
    $project: { 
      name: 1, 
      type: { $trim: { input: "$type" } } 
    } 
  }
])

Résultat :

{ "_id" : 1, "name" : "Wagg", "type" : "Dog" }

Comme prévu, le type le champ a été renvoyé sans espace.

Vous pouvez également utiliser le $ltrim pour couper la partie gauche de la chaîne, et le $rtrim opérateur pour couper le côté droit de la chaîne.

Il y a en fait pas mal de caractères que MongoDB considère comme des caractères d'espacement. Voir Caractères d'espace blanc MongoDB pour une liste complète.

Rogner les autres caractères

Le $trim l'opérateur accepte un chars paramètre qui vous permet de spécifier les caractères à découper.

Exemple :

db.pets.aggregate([
  { 
    $project: {
      name: { $trim: { input: "$name", chars: "g" } } 
    } 
  }
])

Résultat :

{ "_id" : 1, "name" : "Wa" }

Il a supprimé à la fois g caractères à partir de la fin du mot.

Rogner plusieurs caractères

Vous pouvez couper plusieurs caractères en les incluant tous dans les chars arguments.

Exemple :

db.pets.aggregate([
  { 
    $project: { 
      name: { $trim: { input: "$name", chars: "Wgz" } } 
    } 
  }
])

Résultat :

{ "_id" : 1, "name" : "a" }

Dans ce cas, j'ai fourni trois caractères comme mes chars argument, et deux de ces caractères se trouvaient à chaque extrémité de la chaîne. Par conséquent, ces deux personnages ont été coupés. En fait, trois caractères ont été coupés - un W et deux g caractères.

Cependant, soyez prudent lorsque vous faites cela. Voici ce qui se passe lorsque je remplace z avec a dans les chars argument :

db.pets.aggregate([
  { 
    $project: { 
      name: { $trim: { input: "$name", chars: "Wga" } } 
    } 
  }
])

Résultat :

{ "_id" : 1, "name" : "" }

Toute la chaîne a disparu. Il a coupé non seulement le W et g de chaque extrémité de la chaîne, mais il a également coupé le a de la ficelle - même si c'était au milieu de la ficelle.

Ajuster les nombres

Le $trim L'opérateur travaille sur des chaînes. Si nous essayons de réduire le weight champ, nous obtenons une erreur. C'est parce que le weight le champ est un nombre, pas une chaîne.

db.pets.aggregate([
  { 
    $project: { 
      name: 1, 
      weight: { $trim: { input: "$weight", chars: "0" } } 
    } 
  }
])

Résultat :

Error: command failed: {
	"ok" : 0,
	"errmsg" : "$trim requires its input to be a string, got 20 (of type double) instead.",
	"code" : 50699,
	"codeName" : "Location50699"
} : 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

L'erreur nous indique que nous avons fourni un double, même si le $trim l'opérateur nécessite que son entrée soit une chaîne.

Si nous voulions vraiment supprimer le zéro, nous devions d'abord le convertir en chaîne. Nous pouvons le faire soit avec le $convert ou $toString opérateur.

Exemple :

db.pets.aggregate([
  { 
    $project: { 
      name: 1, 
      weight: { $trim: { input: { $toString: "$weight" }, chars: "0" } }
    }
  }
])

Résultat :

{ "_id" : 1, "name" : "Wagg", "weight" : "2" }

Nous pouvons le ramener à un double en utilisant soit le $convert ou $toDouble opérateur.

Exemple complet :

db.pets.aggregate([
  { 
    $project: { 
      name: 1, 
      weight: { $toDouble: { $trim: { input: { $toString: "$weight" }, chars: "0" } } }
    }
  }
])

Résultat :

{ "_id" : 1, "name" : "Wagg", "weight" : 2 }