sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB $ recorte

En MongoDB, el $trim El operador de canalización de agregación elimina los espacios en blanco al principio y al final de una cadena. Esto incluye el carácter nulo.

También puede eliminar cualquier carácter especificado. Por ejemplo, podría usarlo para eliminar todos los guiones (- ) o puntos (. ) o todos los s personajes, etc.

Ejemplo

Supongamos que tenemos una colección llamada pets con el siguiente documento:

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

Podemos ver que el type el campo incluye espacios en blanco a ambos lados de la palabra Dog . Podemos usar el $trim operador para devolver ese campo con el espacio en blanco eliminado.

Ejemplo:

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

Resultado:

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

Como era de esperar, el type el campo se ha devuelto sin el espacio en blanco.

También puede usar el $ltrim operador para recortar la parte izquierda de la cadena, y el $rtrim operador para recortar el lado derecho de la cuerda.

En realidad, hay bastantes caracteres que MongoDB considera espacios en blanco. Consulte Caracteres de espacios en blanco de MongoDB para obtener una lista completa.

Recortar otros caracteres

El $trim el operador acepta un chars parámetro que le permite especificar qué caracteres recortar.

Ejemplo:

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

Resultado:

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

Ha eliminado tanto g caracteres desde el final de la palabra.

Recortar varios caracteres

Puede recortar varios caracteres incluyéndolos todos en chars argumento.

Ejemplo:

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

Resultado:

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

En este caso, proporcioné tres caracteres como mis chars argumento, y dos de esos caracteres estaban en cualquier extremo de la cadena. Por lo tanto, esos dos caracteres fueron recortados. En realidad, se recortaron tres caracteres:uno W y dos g personajes.

Sin embargo, tenga cuidado al hacer esto. Esto es lo que sucede cuando reemplazo z con a en los chars argumento:

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

Resultado:

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

Toda la cadena ha desaparecido. Ha recortado no solo la W y g de cada extremo de la cadena, pero también ha recortado el a de la cuerda, aunque estaba en el medio de la cuerda.

Recortar números

El $trim operador trabaja en cadenas. Si intentamos recortar el weight campo, obtenemos un error. Esto se debe a que el weight el campo es un número, no una cadena.

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

Resultado:

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

El error nos dice que proporcionamos un doble, aunque el $trim operador requiere que su entrada sea una cadena.

Si realmente quisiéramos eliminar el cero, primero tendríamos que convertirlo en una cadena. Podemos hacer eso con $convert o $toString operador.

Ejemplo:

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

Resultado:

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

Podemos volver a convertirlo en un doble usando el $convert o $toDouble operador.

Ejemplo completo:

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

Resultado:

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