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

MongoDB $rtrim

En MongoDB, el $rtrim El operador de canalización de agregación elimina los espacios en blanco del 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 puntos (. ), signos de exclamación (! ), etc. desde el final de una cadena.

Ejemplo

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

{ "_id" : 1, "name" : "Wag!!!", "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 $rtrim operador para devolver ese campo con el espacio en blanco eliminado de la parte derecha de la cadena.

Ejemplo:

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

Resultado:

{ "_id" : 1, "name" : "Wag!!!", "type" : "   Dog" } 

Como era de esperar, el type el campo se ha devuelto sin el espacio en blanco al final. El espacio en blanco al principio aún permanece.

También puede usar el $ltrim operador para recortar la parte izquierda de la cadena, y el $trim operador para recortar ambos lados de la cuerda.

Hay bastantes caracteres que MongoDB considera que son espacios en blanco. Consulte Caracteres de espacios en blanco de MongoDB para obtener una lista completa.

Recortar otros caracteres

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

Ejemplo:

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

Resultado:

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

En este caso incluimos los chars parámetro con un signo de exclamación (! ), lo que resultó en la eliminación de los tres signos de exclamación del final de la cadena.

Recortar varios caracteres

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

Ejemplo:

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

Resultado:

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

En este caso, proporcioné dos caracteres como mis chars argumento, y dos de esos caracteres estaban al final de la cadena. Por lo tanto, esos dos caracteres fueron recortados.

Sin embargo, tenga cuidado al hacer esto. Esto es lo que sucede cuando incluyo todos los caracteres:

db.pets.aggregate([
  { 
    $project: { 
      name: { $rtrim: { input: "$name", chars: "!agW" } } 
    } 
  }
])

Resultado:

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

Toda la cadena ha desaparecido. ¡No solo ha recortado el ! y g de la cadena, pero también ha eliminado la W y a personajes.

Recortar números

El $rtrim 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: { $rtrim: { input: "$weight", chars: "0" } } 
    } 
  }
])

Resultado:

Error: command failed: {
	"ok" : 0,
	"errmsg" : "$rtrim 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 y que el $rtrim 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: { $rtrim: { input: { $toString: "$weight" }, chars: "0" } }
    }
  }
])

Resultado:

{ "_id" : 1, "name" : "Wag!!!", "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: { $rtrim: { input: { $toString: "$weight" }, chars: "0" } } }
    }
  }
])

Resultado:

{ "_id" : 1, "name" : "Wag!!!", "weight" : 2 }