Docs Menu
Docs Home
/ /

db.collection.findOneAndReplace() (método mongosh)

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:

C#Java SyncNode.jsPyMongoCC++GoJava RSKotlin CoroutineKotlin SyncPHPMongoidRustScala
db.collection.findOneAndReplace( filter, replacement, options )

Reemplaza un solo documento según el filtro especificado.

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.

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>
}
)

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 find() están disponibles.

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 <replacement> no puede especificar un valor _id que sea diferente del documento reemplazado.

writeConcern

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.

{ w: <value>, j: <boolean>, wtimeout: <number> }

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 cursor.sort().

maxTimeMS

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 true, findOneAndReplace() puede:

  • Inserta el documento del parámetro replacement si ningún documento coincide con filter. Devuelve null después de insertar el nuevo documento, a menos que returnNewDocument sea true.

  • Reemplaza el documento que corresponde a filter con el documento de replacement.

MongoDB añadirá el campo _id al documento de reemplazo si no está especificado en los documentos filter o replacement. Si _id está presente en ambos, los valores deben ser iguales.

Para evitar múltiples inserciones, asegúrate de que los campos de query estén indexados de forma única.

Se establece por defecto en false.

string

Opcional. A partir mongosh 0.13.2 de, returnDocument es una alternativa a returnNewDocument. Si se configuran ambas opciones, returnDocument tiene prioridad.

returnDocument: "before" devuelve el documento original. returnDocument: "after" devuelve el documento actualizado.

booleano

Opcional. Cuando true, devuelve el documento de reemplazo en lugar del documento original.

Se establece por defecto en false.

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:

collation: {
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}

Al especificar la intercalación, el campo locale es obligatorio; todos los demás campos de intercalación son opcionales. Para las descripciones de los campos, consulta Documento de intercalación.

Si no se especifica la intercalación, pero la colección tiene una intercalación por defecto (ver db.createCollection()), la operación utiliza la intercalación especificada para la colección.

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 el documento original por defecto. Devuelve el documento actualizado si returnDocument after se establece en o returnNewDocument true en.

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.

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,

El campo projection toma un documento con el siguiente formato:

{ field1: <value>, field2: <value> ... }
Proyección
Descripción

<field>: <1 or true>

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 true.

<field>: <0 or false>

Especifica la exclusión de un campo.

"<field>.$": <1 or true>

Utiliza el operador de proyección de arreglo $ para devolver el primer elemento que coincide con la condición de query en el campo de arreglo. Si especificas un entero distinto de cero para el valor de proyección, la operación trata el valor como true.

No disponible para las vistas.

<field>: <array projection>

Utiliza los operadores de proyección de arreglos ($elemMatch, $slice) para especificar los elementos del arreglo que se deben incluir.

No disponible para las vistas.

<field>: <aggregation expression>

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.

  • Si se especifica un literal no numérico, no booleano (como una cadena de caracteres, un arreglo o una expresión de operador) para el valor de proyección, el campo se proyecta con el nuevo valor, por ejemplo:

    • { field: [ 1, 2, 3, "$someExistingField" ] }

    • { field: "New String Value" }

    • { field: { status: "Active", total: { $sum: "$existingArray" } } }

  • Para proyectar un valor literal para un campo, utiliza la expresión de agregación $literal, por ejemplo:

    • { field: { $literal: 5 } }

    • { field: { $literal: true } }

    • { field: { $literal: { fieldWithValue0: 0, fieldWithValue1: 1 } } }

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> } }

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.

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 _id es el único campo que puedes excluir explícitamente.

  • En las proyecciones que excluyen explícitamente campos, el campo _id es el único campo que puedes incluir explícitamente; sin embargo, el campo _id se incluye por defecto.

Para obtener más información sobre la proyección, consulte también:

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

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.

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:

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.

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.

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.

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.

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.

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.

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" }

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 }

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.

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" }

Volver

db.collection.findOneAndDelete

En esta página