MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB:Werden Massenoperationen als Ganzes in das Oplog geschrieben?

Ich werde dies mit dem allgemeinen Vorbehalt angehen, dass ich zugegebenermaßen nicht einmal die Ergebnisse angeschaut habe, aber die Grundprinzipien scheinen mir von Anfang an gültig zu sein.

Was Sie hier berücksichtigen müssen, ist, "was tatsächlich unter der Haube passiert" des "schönen Syntaxzuckers", der Ihnen in allgemeinen Aufrufen präsentiert wird. Dies bedeutet im Grunde genommen, was das "Befehlsformular" der von Ihnen aufgerufenen Operationen tatsächlich tut. In diesem Fall "update" .

Wenn Sie sich diesen Link also bereits angesehen haben, dann ziehen Sie den folgenden "Bulk " Aktualisierungsformular:

var bulk = db.collection.initializeOrdedBulkOp();

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

bulk.execute();

Jetzt wissen Sie bereits, dass dies als eine an den Server gesendet wird Anfrage, aber was Sie wahrscheinlich nicht in Betracht ziehen, ist, dass die eigentliche "Anfrage", die "unter der Haube" gestellt wird, tatsächlich dies ist:

db.runCommand({
    "update": "collection",
    "updates": [
        { "q": { "_id": 1 }, "u": { "$set": { "a": 1 } } },
        { "q": { "_id": 2 }, "u": { "$set": { "b": 2 } } }
    ],
    "ordered": true
})

Daher liegt es nahe, dass das, was Sie tatsächlich in den Protokollen unter der Operation „update“ sehen, tatsächlich so etwas wie (abgekürzt von der vollständigen Ausgabe zu nur der Abfrage) ist:

{ "q": { "_id": 1 }, "u": { "$set": { "a": 1 } } }
{ "q": { "_id": 2 }, "u": { "$set": { "b": 2 } } }

Das bedeutet also, dass jede dieser Aktionen mit dem zugehörigen Befehl im Oplog für die "Wiedergabe" bei der Replikation und/oder bei anderen Aktionen, die Sie möglicherweise ausführen, wie beispielsweise das spezifische "Wiedergeben" der Oplog-Einträge, enthalten ist.

Ich bin mir sicher, dass das tatsächlich passiert, ohne auch nur nachzusehen, weil ich weiß, dass die Treiber die eigentlichen Aufrufe so implementieren, und es macht Sinn, dass jeder Aufruf auf diese Weise im Oplog gehalten wird.

Also "insgesamt", dann nein. Dies sind keine "Transaktionen" und immer unterschiedliche Vorgänge, selbst wenn ihre Übermittlung und Rückgabe innerhalb einer einzigen Anfrage erfolgen. Aber das sind sie nicht ein einmaliger Vorgang und wird und sollte daher nicht als solcher aufgezeichnet werden.