Skip to content

Latest commit

 

History

History
308 lines (262 loc) · 28.8 KB

transacciones-y-operaciones.md

File metadata and controls

308 lines (262 loc) · 28.8 KB

Transacciones y operaciones

Para transacciones:

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, admino localbases 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 getMoredentro de la transacción.
  • Para los cursores creados en una transacción, no puede llamar getMorefuera de la transacción.
  • A partir de MongoDB 4.2, no puede especificar killCursorscomo 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 .

Operaciones admitidas en transacciones de varios documentos

Operaciones CRUD

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 $matchetapa de agregación para la consulta y $groupla etapa de agregación con una $sumexpresión para realizar el recuento.

db.collection.distinct() distinct Disponible en colecciones sin fragmentar.Para colecciones fragmentadas, use la canalización de agregación con el $groupescenario. 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) "4.4" o superior, si la operación de actualización / reemplazo se ejecuta con upsert: trueuna colección no existente, la colección se crea implícitamente.

Para fcv "4.2"o menos, si upsert: true, la operación debe ejecutarse en una colección existente.CONSEJOVer también:

Operaciones DDL

db.collection.insertMany() db.collection.insertOne() db.collection.insert() insert

Para la versión de compatibilidad de funciones (fcv) "4.4" o superior, cuando se ejecuta en una colección no existente, la colección se crea implícitamente.

Para fcv "4.2"o menos, solo se puede ejecutar en una colección existente.CONSEJOVer también:

Operaciones DDL

db.collection.save()

Para la versión de compatibilidad de funciones (fcv) "4.4" o superior, si se inserta contra una colección no existente, la colección se crea implícitamente.

Con fcv "4.2"o menos, si es un inserto, solo se puede ejecutar en una colección existente.CONSEJOVer también:

Operaciones DDL

db.collection.updateOne() db.collection.updateMany() db.collection.replaceOne() db.collection.update() update

Para la versión de compatibilidad de funciones (fcv) "4.4" o superior, si se ejecuta con upsert: trueuna colección no existente, la colección se crea implícitamente.

Para fcv "4.2"o menos, si upsert: true, la operación debe ejecutarse en una colección existente.CONSEJOVer también:

Operaciones DDL

db.collection.bulkWrite()Varios métodos de operación a granel

Para la versión de compatibilidad de funciones (fcv) "4.4" y superior, si upsert: truese ejecuta una operación de inserción o actualización con en una transacción contra una colección no existente, la colección se crea implícitamente.

Para fcv "4.2"o menos, la colección ya debe existir para la inserción y las upsert: trueoperaciones.CONSEJOVer también:

Operaciones DDL

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

Operación de conteo

Para realizar una operación de recuento dentro de una transacción, use la $countetapa de agregación o la etapa de agregación $group(con una $sumexpresió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 $groupcon una $sumpara realizar un recuento. Los controladores 4.0 han desaprobado la count()API.

A partir de MongoDB 4.0.3, el mongoshell proporciona el db.collection.countDocuments()método auxiliar que usa $groupcon una $sumexpresión para realizar un recuento.

Operación distinta

Para realizar una operación distinta dentro de una transacción:

  • Para las colecciones no fragmentadas, puede usar el db.collection.distinct()método / el distinctcomando, así como la canalización de agregación con el $groupescenario.

  • Para las colecciones fragmentadas, no puede utilizar el db.collection.distinct()método ni el distinctcomando.

    Para encontrar los valores distintos para una colección fragmentada, use la canalización de agregación con el $groupescenario en su lugar. Por ejemplo:

    • En lugar de db.coll.distinct("x"), usa

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

Operaciones DDL

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: truedb.collection.findOneAndReplace() con upsert: truedb.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: truedb.collection.updateMany() con upsert: truedb.collection.replaceOne() con upsert: truedb.collection.update() con upsert: true update con upsert: true
db.collection.bulkWrite() con inserto u upsert:trueoperacionesVarios métodos de operación masiva con inserción u upsert:trueoperaciones

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__

Operaciones informativas

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.

Operaciones restringidas

Modificado en la versión 4.4 .

Las siguientes operaciones no están permitidas en transacciones:

CONSEJO Ver también: Operaciones y transacciones de DDL pendientes__