Para las transacciones:
Puedes crear colecciones e índices en transacciones. Para obtener más detalles, consulta Crear colecciones e índices en una transacción
Las colecciones utilizadas en una transacción pueden encontrarse en diferentes bases de datos.
Nota
No puedes crear nuevas colecciones en transacciones de escritura entre particiones. Por ejemplo, si guardas en una colección existente en una partición y creas implícitamente una colección en una partición diferente, MongoDB no puede realizar ambas operaciones en la misma transacción.
No se puede escribir en colecciones con tamaño fijo.
No se puede utilizar el nivel de consistencia de lectura
"snapshot"al leer de una colección con tamaño fijo. (Desde MongoDB 5.0)No puedes leer ni escribir en colecciones en las bases de datos
config,adminolocal.No se puede escribir en las colecciones de
system.*.No puedes devolver el plan de query de las operaciones admitidas usando
explaino comandos similares.
Para los cursores creados fuera de una transacción, no puedes llamar a
getMoredentro de la transacción.Para los cursores creados en una transacción, no puedes llamar a
getMorefuera de la transacción.
No puede especificar el comando
killCursorscomo la primera operación en una transacción.Además, si ejecutas el comando
killCursorsdentro de una transacción, el servidor detiene inmediatamente los cursores especificados. No espera la confirmación de la transacción.
Operaciones admitidas en transacciones multidocumento
Operaciones CRUD
Las siguientes operaciones de lectura y escritura están permitidas en transacciones:
Método | Comando | Nota |
|---|---|---|
Excluyendo las siguientes etapas: | ||
Disponible en colecciones sin fragmentar. For sharded collections, use the aggregation pipeline with the
$group stage. See Distinct Operation. | ||
Si la operación de actualización o reemplazo se ejecuta con Para obtener más detalles, consulta Operaciones de administración. | ||
Si se ejecuta en una colección no existente, la colección se crea implícitamente. Para obtener más detalles, consulta Operaciones de administración. | ||
Si se ejecuta en una colección no existente, la colección se crea implícitamente. Para obtener más detalles, consulta Operaciones de administración. | ||
Si se ejecuta en una colección no existente, la colección se crea implícitamente. Para obtener más detalles, consulta Operaciones de administración. |
Nota
Actualizaciones de valores de clave de partición
Puedes actualizar el valor de la clave de partición de un documento (a menos que el campo de la clave de partición sea el campo inmutable _id) emitiendo operaciones de actualización de un solo documento/findAndModify tanto en una transacción como en una escritura reintentable. Para más detalles, consulte Cambiar el valor de la clave de partición de un documento.
Operación de conteo
Para realizar una operación de conteo dentro de una transacción, utilice la etapa de agregación $count o la etapa de agregación $group (con una expresión $sum).
Los controladores de MongoDB proporcionan una API a nivel de colección countDocuments(filter, options) como un método asistente que utiliza el $group con una expresión $sum para realizar un conteo.
mongosh proporciona el método asistente db.collection.countDocuments() que utiliza $group con una expresión $sum para realizar un conteo.
Operación distinta
Para realizar una operación específica dentro de una transacción:
Para colecciones no fragmentadas, puedes utilizar el método
db.collection.distinct()o el comandodistinct, así como la canalización de agregación con la etapa$group.Para colecciones fragmentadas, no puede utilizar el método
db.collection.distinct()ni el comandodistinct.Para encontrar los valores distintos de una colección fragmentada, utilice la canalización de agregación con la etapa
$groupen su lugar. Por ejemplo:En lugar de
db.coll.distinct("x"), utilicedb.coll.aggregate([ { $group: { _id: null, distinctValues: { $addToSet: "$x" } } }, { $project: { _id: 0 } } ]) En lugar de
db.coll.distinct("x", { status: "A" }), utilice:db.coll.aggregate([ { $match: { status: "A" } }, { $group: { _id: null, distinctValues: { $addToSet: "$x" } } }, { $project: { _id: 0 } } ])
El pipeline devuelve un cursor a un documento:
{ "distinctValues" : [ 2, 3, 1 ] } Itere el cursor para acceder al documento de resultados.
Operaciones de Administración
Puede crear colecciones e índices dentro de una transacción distribuida si la transacción es no es una transacción de escritura entre particiones.
Operaciones explícitas de creación
Comando | Método | notas |
|---|---|---|
Consulta también las Operaciones implícitas de creación. | ||
El índice a crear debe estar en una colección inexistente, en cuyo caso la colección se crea como parte de la operación, o en una nueva colección vacía creada anteriormente en la misma transacción. |
Nota
Para la creación explícita de una colección o un índice dentro de una transacción, el nivel de consistencia de lectura de la transacción debe ser "local".
Para más información sobre cómo crear colecciones e índices en una transacción, consulta Crear colecciones e índices en una transacción.
Operaciones de creación implícitas
También se puede crear una colección de manera implícita mediante las siguientes operaciones de escritura en contra de una colección inexistente:
Método Ejecutar contra una colección inexistente | Comando ejecutado contra una colección inexistente |
|---|---|
db.collection.findAndModify() with upsert: truedb.collection.findOneAndReplace() with upsert: truedb.collection.findOneAndUpdate() with upsert: true |
|
db.collection.updateOne() with upsert: truedb.collection.updateMany() with upsert: truedb.collection.replaceOne() with upsert: true |
|
db.collection.bulkWrite() with insert or upsert:true operationsVarious Bulk Operation Methods with insert or upsert:true operations |
Para otras operaciones CRUD permitidas en transacciones, consulta Operaciones CRUD.
Para más información sobre cómo crear colecciones e índices en una transacción, consulta Crear colecciones e índices en una transacción.
Operaciones de información
Los comandos informativos, como hello, buildInfo, connectionStatus (y sus métodos asistentes) están permitidos en las transacciones; sin embargo, no pueden ser la primera operación de la transacción.
Operaciones restringidas
Las siguientes operaciones no están permitidas en las transacciones:
Creación de nuevas colecciones en transacciones de escritura entre particiones. Por ejemplo, si usted guarda en una colección existente en una partición y crea implícitamente una colección en una partición diferente, MongoDB no puede realizar ambas operaciones en la misma transacción.
Creación explícita de colecciones, por
db.createCollection()ejemplo, el método, e índices, pordb.collection.createIndexes()ejemplo, los métodos y, cuando sedb.collection.createIndex()"local"utiliza un nivel de preocupación de lectura distinto de.Los comandos
listCollectionsylistIndexesy sus métodos asistentes.Otras operaciones que no son CRUD ni informativas, tales como
createUser,getParameter,count, etc. y sus asistentes.