MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB:As operações em massa são gravadas no oplog como um todo?


Entrarei nisso com a ressalva geral de que admito que nem sequer olhei os resultados, mas os princípios básicos me parecem válidos desde o início.

O que você precisa considerar aqui é "o que está realmente acontecendo sob o capô" do "bom açúcar de sintaxe" que você recebe nas chamadas gerais. O que isso significa é basicamente observar o que a "forma de comando" das operações que você está chamando realmente faz. Neste caso "update" .

Portanto, se você já deu uma olhada nesse link, considere o seguinte "Bulk " formulário de atualização:
var bulk = db.collection.initializeOrdedBulkOp();

bulk.find({ "_id": 1 }).updateOne({ "$set": { "a": 1 } });
bulk.find({ "_id": 2 }).updateOne({ "$set": { "b": 2 } });

bulk.execute();

Agora você já sabe que isso está sendo enviado para o servidor como um pedido, mas o que você provavelmente não está considerando é que o "pedido" real feito "sob o capô" é na verdade isso:
db.runCommand({
    "update": "collection",
    "updates": [
        { "q": { "_id": 1 }, "u": { "$set": { "a": 1 } } },
        { "q": { "_id": 2 }, "u": { "$set": { "b": 2 } } }
    ],
    "ordered": true
})

Portanto, é lógico que o que você realmente vê nos logs na operação de "atualização" é algo como (abreviado da saída completa para apenas a consulta):
{ "q": { "_id": 1 }, "u": { "$set": { "a": 1 } } }
{ "q": { "_id": 2 }, "u": { "$set": { "b": 2 } } }

O que, portanto, significa que cada uma dessas ações com o comando associado está no oplog para "replay" na replicação e/ou em outras ações que você pode executar, como especificamente "replay" das entradas do oplog.

Eu teria certeza de que é isso que realmente acontece sem nem olhar, porque eu sei que é como os drivers implementam as chamadas reais, e faz sentido que cada chamada seja mantida dentro do oplog dessa maneira.

Portanto, "como um todo", então não. Não são "transações" e são sempre operações distintas mesmo que seu envio e retorno estejam dentro de uma única solicitação. Mas eles não uma operação singular e, portanto, não será e não deverá ser registrada como tal.