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

MongoDB $replaceOne

El $replaceOne El operador de tubería de agregación se introdujo en MongoDB 4.4.

Este operador reemplaza la primera instancia de una cadena de búsqueda en una cadena de entrada con una cadena de reemplazo y devuelve el resultado.

Si no se encuentra la cadena de búsqueda, entonces $replaceOne devuelve la cadena de entrada.

Ejemplo

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

{
	"_id" : 1,
	"product" : "Left Handed Screwdriver with Left Handed Carry Case"
}

Usemos el $replaceOne operador para reemplazar la primera instancia de la cadena Left Handed con otra cadena:

db.products.aggregate([
   {
     $project:
      {
         product: { $replaceOne: { input: "$product", find: "Left handed", replacement: "Ambidextrous" } }
      }
   }
]).pretty()

Resultado:

{
	"_id" : 1,
	"product" : "Ambidextrous Screwdriver with Left Handed Carry Case"
}

Observe que en realidad hay dos instancias de la cadena de búsqueda (Left Handed ) pero solo se reemplazó la primera instancia.

Para reemplazar todas las instancias, use $replaceAll operador.

Sensibilidad de mayúsculas y minúsculas

El $replaceOne el operador distingue entre mayúsculas y minúsculas.

Ejemplo:

db.products.aggregate([
   {
     $project:
      {
         product: { $replaceOne: { input: "$product", find: "Left handed", replacement: "Ambidextrous" } }
      }
   }
]).pretty()

Resultado:

{
	"_id" : 1,
	"product" : "Left Handed Screwdriver with Left Handed Carry Case"
}

En este caso, cambié el caso de un solo carácter en mi cadena de búsqueda. Cambié Handed a handed . Esto dio como resultado que no se encontrara la cadena de búsqueda y, por lo tanto, no se reemplazó nada. Por lo tanto, se devolvió la cadena de entrada.

Sensibilidad diacrítica

El $replaceOne el operador es sensible a signos diacríticos.

Supongamos que agregamos el siguiente documento a nuestra colección:

{ "_id": 2, "product": "Toupée Tape" }

Y ahora intentemos buscar y reemplazar la palabra Toupée , pero olvida usar el acento agudo:

db.products.aggregate([
    { $match: { _id: 2 } },
   {
     $project:
      {
         product: { $replaceOne: { input: "$product", find: "Toupee", replacement: "Wig" } }
      }
   }
])

Resultado:

{ "_id" : 2, "product" : "Toupée Tape" }

Ningún cambio.

No incluí el diacrítico en mi cadena de búsqueda, por lo que no hubo ninguna coincidencia.

Aquí está de nuevo, pero esta vez incluyo el signo diacrítico:

db.products.aggregate([
    { $match: { _id: 2 } },
   {
     $project:
      {
         product: { $replaceOne: { input: "$product", find: "Toupée", replacement: "Wig" } }
      }
   }
])

Resultado:

{ "_id" : 2, "product" : "Wig Tape" }

Esta vez se encontró y reemplazó la cadena de búsqueda.

Expresiones nulas

Si alguna de las expresiones proporcionadas a $replaceOne son null , el resultado es null .

Aquí hay un ejemplo de proporcionar un null campo de operador a $replaceOne :

db.products.aggregate([
   {
     $project:
      {
         product: { $replaceOne: { input: "$product", find: null, replacement: "Ambidextrous" } }
      }
   }
]).pretty()

Resultado:

{ "_id" : 1, "product" : null }
{ "_id" : 2, "product" : null }

En este caso el find el campo del operador era null y entonces el resultado fue null .

Campos faltantes

Si la input o find los campos de operador se refieren a un campo que no existe, entonces el resultado es null .

Ejemplo:

db.products.aggregate([
   {
     $project:
      {
         product: { $replaceOne: { input: "$oops", find: "Left Handed", replacement: "Ambidextrous" } }
      }
   }
]).pretty()

Resultado:

{ "_id" : 1, "product" : null }
{ "_id" : 2, "product" : null }

Valores que no son cadenas

Todas las expresiones proporcionadas a $replaceOne debe evaluarse como una cadena o null . Proporcionar cualquier otro tipo devuelve un error.

Supongamos que agregamos el siguiente documento a nuestra colección:

{ "_id" : 3, "product" : "Long Weight", "price" : NumberDecimal("7.50") }

Intentemos hacer una búsqueda y reemplazar en el price campo:

db.products.aggregate([
   {
     $project:
      {
         product: { $replaceOne: { input: "$price", find: "7.50", replacement: "10.50" } }
      }
   }
])

Resultado:

Error: command failed: {
	"ok" : 0,
	"errmsg" : "$replaceOne requires that 'input' be a string, found: 7.50",
	"code" : 51746,
	"codeName" : "Location51746"
} : 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

Devuelve un error, como se esperaba.

Normalización Unicode

El $replaceOne el operador no realiza ninguna normalización Unicode.

Consulte la documentación de MongoDB para obtener más información sobre esto y un ejemplo.