MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB:le operazioni di massa vengono scritte nell'oplog nel suo insieme?

Entrerò in questo con l'avvertenza generale che ammetto di non aver nemmeno guardato i risultati, ma i principi di base mi sembrano validi fin dall'inizio.

Quello che devi considerare qui è "cosa sta effettivamente accadendo sotto il cofano" del "bello sintassi zucchero" che ti viene presentato nelle chiamate generali. Ciò significa fondamentalmente guardare cosa fa effettivamente il "modulo di comando" delle operazioni che stai chiamando. In questo caso "update" .

Quindi, se hai già dato un'occhiata a quel link, considera quanto segue "In blocco " modulo di aggiornamento:

var bulk = db.collection.initializeOrdedBulkOp();

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

bulk.execute();

Ora sai già che questo viene inviato al server come uno richiesta, ma quello che probabilmente non stai considerando è che la vera "richiesta" fatta "sotto il cofano" è in realtà questa:

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

Pertanto è logico che ciò che vedi effettivamente nei log sotto l'operazione di "aggiornamento" sia in realtà qualcosa di simile (abbreviato da output completo alla sola query):

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

Ciò significa quindi che ciascuna di queste azioni con il comando associato è nell'oplog per la "riproduzione" sulla replica e/o su altre azioni che potresti eseguire, ad esempio specificamente la "riproduzione" delle voci dell'oplog.

Sarei sicuro che è ciò che effettivamente accade senza nemmeno guardare, perché so che è il modo in cui i driver implementano le chiamate effettive e ha senso che ogni chiamata venga mantenuta all'interno dell'oplog in questo modo.

Quindi "nel suo insieme", quindi no. Non si tratta di "transazioni" e sono sempre operazioni distinte anche se il loro invio e restituzione rientrano in una singola richiesta. Ma non non lo sono un'operazione singolare, e quindi non sarà e non dovrebbe essere registrata come tale.