Para transacciones:
- Puede especificar operaciones de lectura / escritura (CRUD) en colecciones existentes . Para obtener una lista de operaciones CRUD, consulte Operaciones CRUD .
- Cuando usa la versión de compatibilidad de funciones (fcv)
"4.4"
o superior, puede crear colecciones e índices en las transacciones. Para obtener más información, consulte Crear colecciones e índices en una transacción. - Las colecciones utilizadas en una transacción pueden estar en diferentes bases de datos.
NOTA: No puede crear nuevas colecciones en transacciones de escritura entre particiones. Por ejemplo, si escribe en una colección existente en un fragmento e implícitamente crea una colección en un fragmento diferente, MongoDB no puede realizar ambas operaciones en la misma transacción.
- No puede escribir en colecciones limitadas . (A partir de MongoDB 4.2)
- No se puede leer / escribir en colecciones en las
config
,admin
olocal
bases de datos. - No puede escribir en
system.*
colecciones. - No puede devolver el plan de consulta de la operación admitida (es decir
explain
). - Para los cursores creados fuera de una transacción, no puede llamar
getMore
dentro de la transacción. - Para los cursores creados en una transacción, no puede llamar
getMore
fuera de la transacción. - A partir de MongoDB 4.2, no puede especificar
killCursors
como primera operación en una transacción .
Las operaciones que afectan el catálogo de la base de datos, como la creación o eliminación de una colección o un índice, no se permiten en transacciones de varios documentos. Por ejemplo, una transacción de varios documentos no puede incluir una operación de inserción que daría lugar a la creación de una nueva colección. Consulte Operaciones restringidas .
Las siguientes operaciones de lectura / escritura están permitidas en las transacciones:
Método | Mando | Nota |
---|---|---|
db.collection.aggregate()
|
aggregate
|
Excluyendo las siguientes etapas: |
db.collection.countDocuments()
|
Excluyendo las siguientes expresiones de operador de consulta: El método utiliza la |
|
db.collection.distinct()
|
distinct
|
Disponible en colecciones sin fragmentar.Para colecciones fragmentadas,
use la canalización de agregación con el $group escenario.
Consulte Operación distinta . |
db.collection.find()
|
find
|
|
geoSearch
|
||
db.collection.deleteMany()
db.collection.deleteOne()
db.collection.remove()
|
delete
|
|
db.collection.findOneAndDelete()
db.collection.findOneAndReplace()
db.collection.findOneAndUpdate()
|
findAndModify
|
Para la versión de compatibilidad de funciones (fcv) Para fcv |
db.collection.insertMany()
db.collection.insertOne()
db.collection.insert()
|
insert
|
Para la versión de compatibilidad de funciones (fcv) Para fcv |
db.collection.save()
|
Para la versión de compatibilidad de funciones (fcv) Con fcv |
|
db.collection.updateOne()
db.collection.updateMany()
db.collection.replaceOne()
db.collection.update()
|
update
|
Para la versión de compatibilidad de funciones (fcv) Para fcv |
db.collection.bulkWrite() Varios
métodos de operación a granel
|
Para la versión de compatibilidad de funciones (fcv) Para fcv |
NOTA: ****Actualizaciones de los valores clave de Shard: A partir de MongoDB 4.2, puede actualizar el valor de la clave de fragmento de un documento (a menos que el campo de clave de fragmento sea el _id
campo inmutable ) mediante la emisión de operaciones de actualización / findAndModify de un solo documento en una transacción o como una escritura recuperable . Para obtener más información, consulte Cambiar el valor de clave de fragmento de un documento .
Para realizar una operación de recuento dentro de una transacción, use la $count
etapa de agregación o la etapa de agregación $group
(con una $sum
expresión).
Los controladores MongoDB compatibles con las características 4.0 proporcionan una API de nivel de colección countDocuments(filter, options)
como método auxiliar que usa la expresión $group
con una $sum
para realizar un recuento. Los controladores 4.0 han desaprobado la count()
API.
A partir de MongoDB 4.0.3, el mongo
shell proporciona el db.collection.countDocuments()
método auxiliar que usa $group
con una $sum
expresión para realizar un recuento.
Para realizar una operación distinta dentro de una transacción:
-
Para las colecciones no fragmentadas, puede usar el
db.collection.distinct()
método / eldistinct
comando, así como la canalización de agregación con el$group
escenario. -
Para las colecciones fragmentadas, no puede utilizar el
db.collection.distinct()
método ni eldistinct
comando.Para encontrar los valores distintos para una colección fragmentada, use la canalización de agregación con el
$group
escenario en su lugar. Por ejemplo:-
En lugar de
db.coll.distinct("x")
, usadb.coll.aggregate([ { $group: { _id: null, distinctValues: { $addToSet: "$x" } } }, { $project: { _id: 0 } } ])
-
En lugar de
db.coll.distinct("x", { status: "A" })
, use:db.coll.aggregate([ { $match: { status: "A" } }, { $group: { _id: null, distinctValues: { $addToSet: "$x" } } }, { $project: { _id: 0 } } ])
La canalización devuelve un cursor a un documento:
{ "distinctValues" : [ 2, 3, 1 ] }
Itere el cursor para acceder al documento de resultados.
-
A partir de MongoDB 4.4 con la versión de compatibilidad de funciones (fcv) "4.4"
, puede crear colecciones e índices dentro de una transacción de varios documentos si la transacción no es una transacción de escritura entre fragmentos.
Operaciones DDL explícitas
Mando | Método | Notas |
---|---|---|
create |
db.createCollection() |
Consulte también las operaciones DDL implícitas . |
createIndexes |
db.collection.createIndex() db.collection.createIndexes() |
El índice a crear debe estar en una colección no existente, 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 preocupación de lectura de la transacción debe ser "local"
.
Para obtener más información sobre cómo crear colecciones e índices en una transacción, consulte Crear colecciones e índices en una transacción .
CONSEJO Ver también:shouldMultiDocTxnCreateCollectionAndIndexes
__
Operaciones DDL implícitas
También puede crear implícitamente una colección a través de las siguientes operaciones de escritura contra una colección no existente :
Método ejecutado contra colección no existente | Ejecutar comando contra colección no existente |
---|---|
db.collection.findAndModify() con upsert: true db.collection.findOneAndReplace() con upsert: true db.collection.findOneAndUpdate() con upsert: true |
findAndModify con upsert: true |
db.collection.insertMany() db.collection.insertOne() db.collection.insert() |
insert |
db.collection.save() da como resultado un inserto |
|
db.collection.updateOne() con upsert: true db.collection.updateMany() con upsert: true db.collection.replaceOne() con upsert: true db.collection.update() con upsert: true |
update con upsert: true |
db.collection.bulkWrite() con inserto u upsert:true operacionesVarios métodos de operación masiva con inserción u upsert:true operaciones |
Para otras operaciones CRUD permitidas en transacciones, consulte Operaciones CRUD .
Para obtener más información sobre cómo crear colecciones e índices en una transacción, consulte Crear colecciones e índices en una transacción .
CONSEJO Ver también:shouldMultiDocTxnCreateCollectionAndIndexes
__
Comandos informativos, tales como hello
, buildInfo
, connectionStatus
(y sus métodos de ayuda) se permiten en las transacciones; sin embargo, no pueden ser la primera operación de la transacción.
Modificado en la versión 4.4 .
Las siguientes operaciones no están permitidas en transacciones:
- Operaciones que afectan el catálogo de la base de datos, como crear o eliminar una colección o un índice cuando se usa la versión de compatibilidad de funciones (fcv)
"4.2"
o una versión anterior . Con fcv"4.4"
o superior, puede crear colecciones e índices en transacciones a menos que la transacción sea una transacción de escritura entre fragmentos. Para obtener más información, consulte Crear colecciones e índices en una transacción . - Creación de nuevas colecciones en transacciones de escritura entre fragmentos. Por ejemplo, si escribe en una colección existente en un fragmento e implícitamente crea una colección en un fragmento diferente, MongoDB no puede realizar ambas operaciones en la misma transacción.
- Creación explícita de colecciones , por ejemplo,
db.createCollection()
método e índices, por ejemplo,db.collection.createIndexes()
ydb.collection.createIndex()
métodos, cuando se utiliza un nivel de preocupación de lectura diferente a"local"
. - Las
listCollections
y loslistIndexes
comandos y sus métodos de ayuda. - Otras operaciones no CRUD y no informativos, como
createUser
,getParameter
,count
, etc, y sus ayudantes.
CONSEJO Ver también: Operaciones y transacciones de DDL pendientes__