MongoDB con controladores
Esta página documenta una mongosh . Para ver el método equivalente en un driver de MongoDB, se debe consultar la página correspondiente al lenguaje de programación:
Definición
db.collection.findOneAndReplace( filter, replacement, options )Reemplaza un solo documento según el filtro especificado.
Compatibilidad
Este método está disponible en implementaciones alojadas en los siguientes entornos:
MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube
Nota
Este comando es compatible con todos los clústeres de MongoDB Atlas. Para obtener información sobre el soporte de Atlas para todos los comandos, consulte Comandos no compatibles.
MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB
MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.
Sintaxis
El método findOneAndReplace() tiene la siguiente forma:
db.collection.findOneAndReplace( <filter>, <replacement>, { writeConcern: <document>, projection: <document>, sort: <document>, maxTimeMS: <number>, upsert: <boolean>, returnDocument: <string>, returnNewDocument: <boolean>, collation: <document> } )
Campos y opciones
El método toma los siguientes campos y findOneAndReplace() opciones:
Campo | Tipo | Descripción | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
Documento | Los criterios de selección para actualizar. Los mismos selectores query que en el método Para reemplazar el primer documento devuelto en la colección, especifique un documento vacío Si no se especifica, el valor es por defecto un documento vacío. Si el argumento de la consulta no es un documento, la operación devuelve un error. | |||||||||||
Documento | El documento de reemplazo. No puede contener operadores de actualización. El documento | |||||||||||
| Documento | Opcional. Un documento que expresa el nivel de confirmación de escritura. Omite el uso del nivel de confirmación de escritura por defecto. No establezcas explícitamente el nivel de confirmación de escritura para la operación si se ejecuta en una transacción. Para usar el nivel de confirmación de escritura con transacciones, consulta Transacciones y nivel de confirmación de escritura. | ||||||||||
Documento | Opcional. Un subconjunto de campos que se deben devolver. Para devolver todos los campos del documento coincidente, omita este campo. Si el argumento de proyección no es un documento, la operación genera un error. | |||||||||||
Documento | Opcional. Especifica un orden de clasificación para los documentos que coinciden con el filtro. Si el argumento de orden no es un documento, la operación genera un error. Consulte | |||||||||||
| Número | Opcional. Especifica un límite de tiempo en milisegundos para que la operación se complete. Devuelve un error si se supera el límite. | ||||||||||
booleano | Opcional. Cuando
MongoDB añadirá el campo Para evitar múltiples inserciones, asegúrate de que los campos de Se establece por defecto en | |||||||||||
string | Opcional. A partir
| |||||||||||
booleano | Opcional. Cuando Se establece por defecto en | |||||||||||
Documento | Opcional. Especifica la intercalación a utilizar para la operación. La intercalación permite a los usuarios especificar reglas propias del lenguaje para la comparación de strings, como reglas para el uso de mayúsculas y minúsculas y marcas de acento. La opción de intercalación tiene la siguiente sintaxis: Al especificar la intercalación, el campo Si no se especifica la intercalación, pero la colección tiene una intercalación por defecto (ver Si no se especifica ninguna intercalación para la colección o para las operaciones, MongoDB utiliza la comparación binaria simple usada en versiones anteriores para las comparaciones de strings. No puedes especificar varias intercalaciones para una operación. Por ejemplo, no puedes especificar diferentes intercalaciones por campo, o si realizas una búsqueda con un ordenamiento, no puedes usar una intercalación para la búsqueda y otra para el ordenamiento. |
Devuelve
Devuelve el documento original por defecto. Devuelve el documento actualizado si returnDocument after se establece en o returnNewDocument true en.
Comportamiento
Coincidencia de documento
db.collection.findOneAndReplace() reemplaza el primer documento coincidente de la colección que coincide filter con. El sort campo permite determinar qué documento se modifica.
Proyección
Importante
Consistencia del lenguaje
Como parte de hacer que la proyección de find() y findAndModify() sea coherente con la etapa de agregación de $project,
Las proyecciones
find()y lafindAndModify()pueden aceptar expresiones y sintaxis de agregación.MongoDB aplica restricciones adicionales con respecto a las proyecciones. Consulta restricciones de proyección para obtener más detalles.
El campo projection toma un documento con el siguiente formato:
{ field1: <value>, field2: <value> ... }
Proyección | Descripción |
|---|---|
| Especifica la inclusión de un campo. Si especificas un entero distinto de cero para el valor de proyección, la operación trata el valor como |
| Especifica la exclusión de un campo. |
| |
| Utiliza los operadores de proyección de arreglos ( No disponible para las vistas. |
| Especifica el valor del campo proyectado. Con el uso de expresiones y sintaxis de agregación, incluido el uso de literales y variables de agregación, se pueden proyectar campos nuevos o proyectar campos existentes con valores nuevos.
|
Especificación de campo embebido
Para campos en documentos incrustados, puedes especificar el campo mediante:
notación de puntos, por ejemplo
"field.nestedfield": <value>formulario anidado, por ejemplo
{ field: { nestedfield: <value> } }
_id Proyección de campo
El campo _id se incluye por defecto en los documentos devueltos, a menos que especifiques explícitamente _id: 0 en la proyección para suprimir el campo.
Inclusión o exclusión
Una projection no puede contener ambas especificaciones de inclusión y exclusión, con la excepción del campo _id:
En las proyecciones que incluyen explícitamente campos, el campo
_ides el único campo que puedes excluir explícitamente.En las proyecciones que excluyen explícitamente campos, el campo
_ides el único campo que puedes incluir explícitamente; sin embargo, el campo_idse incluye por defecto.
Para obtener más información sobre la proyección, consulte también:
Colecciones fragmentadas
Es posible que a los documentos de una colección fragmentada les falten los campos de clave de fragmento. Para identificar un documento que no tenga la clave de fragmento, puede usar la null coincidencia de igualdad. Junto con otra condición de filtro (como en el _id campo). Por ejemplo:
{ _id: <value>, <shardkeyfield>: null } // _id of the document missing shard key
Modificación de la clave de fragmentación
Puede actualizarse el valor de clave de partición de un documento a menos que el campo de clave de partición sea el campo _id inmutable.
Advertencia
Los documentos en colecciones particionadas pueden no tener los campos de clave de partición. Toma precauciones para evitar remover accidentalmente la clave de partición al cambiar el valor de clave de partición de un documento.
Para modificar el valor de clave de fragmentación existente con db.collection.findOneAndReplace():
Debes ejecutar en un
mongos. No emitas la operación directamente en la partición.Usted debe ejecutar ya sea en una transacción o como una escritura reintentable.
Debe incluir un filtro de igualdad en la clave de partición completa.
Clave de fragmentación faltante
Los documentos en una colección particionada pueden carecer de los campos de la clave de partición. Para usar db.collection.findOneAndReplace() a fin de establecer la clave de partición faltante del documento,
Debes ejecutar en un
mongos. No emitas la operación directamente en la partición.Debe ejecutar ya sea en una transacción o como una escritura reintentable si el nuevo valor de la clave de partición no es
null.Debe incluir un filtro de igualdad en la clave de partición completa.
Tip
Dado que un valor de clave faltante se devuelve como parte de una coincidencia exacta nula, para evitar actualizar una clave con valor nulo, incluya condiciones de query adicionales (como en el campo _id) según corresponda.
Véase también:
Transacciones
db.collection.findOneAndReplace() puede usarse dentro de transacciones distribuidas.
Importante
En la mayoría de los casos, una transacción distribuida incurre en un costo de rendimiento mayor que las escrituras de documentos individuales, y la disponibilidad de transacciones distribuidas no debería ser un sustituto para un diseño de esquema efectivo. Para muchos casos, el modelo de datos desnormalizado (documento incrustado y matrices) seguirá siendo óptimo para tus datos y casos de uso. Es decir, en muchos casos, modelar tus datos de forma adecuada minimizará la necesidad de transacciones distribuidas.
Para consideraciones adicionales sobre el uso de transacciones (como el límite de tiempo de ejecución y el límite de tamaño del oplog), consulta también las consideraciones de producción.
Inserta dentro de transacciones
Puedes crear colecciones e índices dentro de una transacción distribuida si la transacción no es una transacción de escritura entre particiones.
db.collection.findOneAndReplace() con upsert: true puede ejecutarse en una colección existente o en una colección inexistente. Si se ejecuta en una colección que es inexistente, la operación crea la colección.
Nivel de confirmación de escritura y transacciones
No establezcas explícitamente el nivel de confirmación de escritura para la operación si se ejecuta en una transacción. Para usar el nivel de confirmación de escritura con transacciones, consulta Transacciones y nivel de confirmación de escritura.
Entradas de OpLog
Si una db.collection.findOneAndReplace() operación reemplaza correctamente un documento, se añade una entrada al registro de operaciones. Si falla o no encuentra un documento para reemplazar, no se añade ninguna entrada al registro de operaciones.
Ejemplos
Reemplazar un documento
Crea una colección de ejemplo scores con los siguientes documentos:
db.scores.insertMany([ { "_id" : 1, "team" : "Fearful Mallards", "score" : 25000 }, { "_id" : 2, "team" : "Tactful Mooses", "score" : 23500 }, { "_id" : 3, "team" : "Aquatic Ponies", "score" : 19250 }, { "_id" : 4, "team" : "Cuddly Zebras", "score" : 15235 }, { "_id" : 5, "team" : "Garrulous Bears", "score" : 18000 } ]);
La siguiente operación encuentra un documento con score menor que 20000 y lo reemplaza:
db.scores.findOneAndReplace( { "score" : { $lt : 20000 } }, { "team" : "Observant Badgers", "score" : 20000 } )
La operación devuelve el documento original que ha sido reemplazado:
{ "_id" : 3, "team" : "Aquatic Ponies", "score" : 19250 }
Si returnNewDocument fuera verdadero, la operación devolvería el documento de reemplazo.
Aunque varios documentos cumplen los criterios de filtro, reemplaza solo undb.collection.findOneAndReplace() documento.
Ordenar y reemplazar un documento
Crea una colección de ejemplo scores con los siguientes documentos:
db.scores.insertMany([ { "_id" : 1, "team" : "Fearful Mallards", "score" : 25000 }, { "_id" : 2, "team" : "Tactful Mooses", "score" : 23500 }, { "_id" : 3, "team" : "Aquatic Ponies", "score" : 19250 }, { "_id" : 4, "team" : "Cuddly Zebras", "score" : 15235 }, { "_id" : 5, "team" : "Garrulous Bears", "score" : 18000 } ]);
Al incluir una ordenación ascendente en el score campo, el siguiente ejemplo reemplaza el documento con la puntuación más baja entre aquellos documentos que coinciden con el filtro:
db.scores.findOneAndReplace( { "score" : { $lt : 20000 } }, { "team" : "Observant Badgers", "score" : 20000 }, { sort: { "score" : 1 } } )
La operación devuelve el documento original que ha sido reemplazado:
{ "_id" : 4, "team" : "Cuddly Zebras", "score" : 15235 }
Consulte Reemplazar un documento para ver el resultado no ordenado de este comando.
Campos específicos del proyecto en el documento de devolución
Crea una colección de ejemplo scores con los siguientes documentos:
db.scores.insertMany([ { "_id" : 1, "team" : "Fearful Mallards", "score" : 25000 }, { "_id" : 2, "team" : "Tactful Mooses", "score" : 23500 }, { "_id" : 3, "team" : "Aquatic Ponies", "score" : 19250 }, { "_id" : 4, "team" : "Cuddly Zebras", "score" : 15235 }, { "_id" : 5, "team" : "Garrulous Bears", "score" : 18000 } ])
La siguiente operación utiliza proyección para mostrar solo el team campo en el documento devuelto:
db.scores.findOneAndReplace( { "score" : { $lt : 22250 } }, { "team" : "Therapeutic Hamsters", "score" : 22250 }, { sort : { "score" : 1 }, projection: { "_id" : 0, "team" : 1 } } )
La operación devuelve el documento original con solo el team campo:
{ "team" : "Cuddly Zebras" }
Reemplazar documento con límite de tiempo
La siguiente operación establece un límite de tiempo de 5ms para completarse:
try { db.scores.findOneAndReplace( { "score" : { $gt : 25000 } }, { "team" : "Emphatic Rhinos", "score" : 25010 }, { maxTimeMS: 5 } ); } catch(e){ print(e); }
Si la operación excede el límite de tiempo, devuelve:
Error: findAndModifyFailed failed: { "ok" : 0, "errmsg" : "operation exceeded time limit", "code" : 50 }
Reemplazar documento con Upsert
La siguiente operación utiliza el campo upsert para insertar el documento de reemplazo si ningún documento coincide con el filtro:
try { db.scores.findOneAndReplace( { "team" : "Fortified Lobsters" }, { "_id" : 6019, "team" : "Fortified Lobsters" , "score" : 32000}, { upsert : true, returnDocument: "after" } ); } catch (e){ print(e); }
La operación devuelve lo siguiente:
{ "_id" : 6019, "team" : "Fortified Lobsters", "score" : 32000 }
Si se estableció returnDocument: "before", la operación devolvería null porque no hay ningún documento original para devolver.
Especificar la intercalación
La intercalación permite a los usuarios especificar reglas propias del lenguaje para la comparación de strings, como reglas para el uso de mayúsculas y minúsculas y marcas de acento.
Crea una colección de ejemplo myColl con los siguientes documentos:
db.myColl.insertMany([ { _id: 1, category: "café", status: "A" }, { _id: 2, category: "cafe", status: "a" }, { _id: 3, category: "cafE", status: "a" } ]);
La siguiente operación incluye la opción de intercalación:
db.myColl.findOneAndReplace( { category: "cafe", status: "a" }, { category: "cafÉ", status: "Replaced" }, { collation: { locale: "fr", strength: 1 } } );
La operación devuelve el siguiente documento:
{ "_id" : 1, "category" : "café", "status" : "A" }