Transações e Operações
Nesta página
Para transações:
Você pode criar collections e índices em transações. Para obter detalhes, consulte Criar collections e índices em uma transação
A coletas utilizadas em uma transação podem estar em diferentes bancos de dados.
Observação
Você não pode criar uma nova coleta em transações de gravação entre fragmentos. Por exemplo, se você gravar em uma coleta existente em um fragmento e criar implicitamente uma coleta em um fragmento diferente, o MongoDB não poderá executar ambas as operações na mesma transação.
Você não pode gravar em coletas limitadas .
Não é possível usar read concern
"snapshot"
ao ler de uma capped collection. (A partir do MongoDB 5.0)Você não pode ler/gravar em coletas nos bancos de dados
config
,admin
oulocal
.Você não pode gravar na coleção
system.*
.Não é possível retornar o plano de query da operação compatível utilizando
explain
ou comandos semelhantes.
Para cursores criados fora de uma transação, você não pode chamar
getMore
dentro da transação.Para cursores criados em uma transação, não é possível chamar
getMore
fora da transação.
Você não pode especificar o comando como a primeira operação em
killCursors
uma transação.Além disso, se você executar o comando
killCursors
em uma transação, o servidor interromperá imediatamente os cursores especificados. Não espera que a transação seja confirmada.
Operações suportadas em transações multidocumentos
Operações CRUD
As seguintes operações de leitura/gravação são permitidas nas transações:
Método | Comando | Observação |
---|---|---|
Excluindo os seguintes estágios: | ||
Disponível em coleções não partilhadas. For sharded collections, use the aggregation pipeline with the
$group stage. See Distinct Operation. | ||
Se a operação de atualização ou substituição for executada com Para obter mais detalhes,consulte Operações de administração. | ||
Se for executado em uma coleção inexistente, a coleção será criada implicitamente. Para obter mais detalhes,consulte Operações de administração. | ||
Se for executado em uma coleção inexistente, a coleção será criada implicitamente. Para obter mais detalhes,consulte Operações de administração. | ||
Se for executado em uma coleção inexistente, a coleção será criada implicitamente. Para obter mais detalhes,consulte Operações de administração. |
Observação
Atualizações nos valores da chave de shard
Você pode atualizar o valor da chave do fragmento de um documento (a menos que o campo da chave do fragmento seja o campo imutável _id
) emitindo operações de atualização/encontro de documento único e modificação em uma transação ou como escrita repetível. Para obter detalhes, consulte Alterar o valor chave do fragmento de um documento.
Operação de contagem
Para realizar uma operação de contagem dentro de uma transação, use o estágio de agregação $count
ou o estágio de agregação $group
(com uma expressão $sum
de agregação.
Os drivers do MongoDB fornecem uma API de collection countDocuments(filter, options)
como um método auxiliar que usa o $group
com uma expressão $sum
para executar uma contagem.
O mongosh
fornece o método auxiliar db.collection.countDocuments()
, que usa o $group
com a expressão $sum
para executar uma contagem.
Operação Distinta
Para realizar uma operação distinta dentro de uma transação:
Para coleções não fragmentadas, você pode usar o
db.collection.distinct()
método /odistinct
comando , bem como o pipeline de agregação com o estágio$group
.Para coleções fragmentadas, você não pode utilizar o método
db.collection.distinct()
ou o comandodistinct
.Para localizar os valores distintos para uma coleção fragmentada, use o pipeline de agregação com o estágio
$group
. Por exemplo:Em vez de
db.coll.distinct("x")
, usedb.coll.aggregate([ { $group: { _id: null, distinctValues: { $addToSet: "$x" } } }, { $project: { _id: 0 } } ]) Em vez de
db.coll.distinct("x", { status: "A" })
, use:db.coll.aggregate([ { $match: { status: "A" } }, { $group: { _id: null, distinctValues: { $addToSet: "$x" } } }, { $project: { _id: 0 } } ])
O pipeline retorna um cursor para um documento:
{ "distinctValues" : [ 2, 3, 1 ] } Itere o cursor para acessar o documento de resultados.
Operações de administração
Você pode criar coleção e indexes dentro de uma transaction distribuída se a transaction não for uma transação de escrita de estilhaço cruzado.
Operações de criação explícitas
Comando | Método | Notas |
---|---|---|
Consulte também as Operações de criação implícitas. | ||
O índice a criar tem de estar numa recolha não existente, caso em que a recolha é criada como parte da operação, ou numa nova recolha vazia criada anteriormente na mesma transação. |
Observação
Para a criação explícita de uma collection ou de um índice em uma transação, o nível de read concern da transação deve ser "local"
.
Para obter mais informações sobre como criar coleções e índices em uma transação, consulte Criar coleções e índices em uma transação.
Operações de criação implícitas
Você também pode criar implicitamente uma coleção por meio das seguintes operações de gravação em uma coleção não existente:
Método executado em uma coleção inexistente | Comando Executar em collection inexistente |
---|---|
db.collection.findAndModify() with upsert: true db.collection.findOneAndReplace() with upsert: true db.collection.findOneAndUpdate() with upsert: true |
|
db.collection.updateOne() with upsert: true db.collection.updateMany() with upsert: true db.collection.replaceOne() with upsert: true |
|
db.collection.bulkWrite() with insert or upsert:true operationsVarious Bulk Operation Methods with insert or upsert:true operations |
Para outras operações CRUD permitidas em transações, consulte Operações CRUD.
Para obter mais informações sobre como criar coleções e índices em uma transação, consulte Criar coleções e índices em uma transação.
Operações Informativas
Comandos informativos, como hello
, buildInfo
, connectionStatus
(e seus métodos de ajuda) são permitidos em transações; no entanto, eles não podem ser a primeira operação na transação.
Operações Restritas
As seguintes operações não são permitidas nas transações:
Criação de nova coleta em transações de gravação entre fragmentos. Por exemplo, se você gravar em uma coleta existente em um fragmento e criar implicitamente uma coleta em um fragmento diferente, o MongoDB não poderá executar ambas as operações na mesma transação.
Criação explícita de coleções, por exemplo, Método
db.createCollection()
e índices, por exemplo,db.collection.createIndexes()
e métodosdb.collection.createIndex()
ao utilizar um nível de preocupação de leitura diferente de"local"
.Os comandos
listCollections
elistIndexes
e seus métodos de auxiliar.Outras operações não CRUD e não informacionais, tais como
createUser
,getParameter
,count
, etc. e seus auxiliares.Operações paralelas. Para atualizar vários namespaces simultaneamente, considere usar o
bulkWrite
comando.