MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB :Les opérations en bloc sont-elles écrites dans l'oplog dans son ensemble ?

J'aborderai cela avec la mise en garde générale que j'avoue n'avoir même pas regardé les résultats, mais les principes de base me semblent valables dès le départ.

Ce que vous devez considérer ici, c'est "ce qui se passe réellement sous le capot" du "bon sucre de syntaxe" qui vous est présenté dans les appels généraux. Cela signifie essentiellement regarder ce que la "forme de commande" des opérations que vous appelez fait réellement. Dans ce cas "update" .

Donc, si vous avez déjà consulté ce lien, considérez ce qui suit "Bulk " formulaire de mise à jour :

var bulk = db.collection.initializeOrdedBulkOp();

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

bulk.execute();

Maintenant, vous savez déjà que ceci est envoyé au serveur en tant que un demande, mais ce que vous n'envisagez probablement pas, c'est que la "demande" réelle faite "sous le capot" est en fait celle-ci :

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

Par conséquent, il va de soi que ce que vous voyez réellement dans les journaux sous l'opération "mise à jour" est en fait quelque chose comme (abrégé de la sortie complète à la requête uniquement) :

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

Ce qui signifie donc que chacune de ces actions avec la commande associée est dans l'oplog pour "rejouer" sur la réplication et/ou sur d'autres actions que vous pourriez effectuer comme spécifiquement "rejouer" les entrées de l'oplog.

Je serais sûr que c'est ce qui se passe réellement sans même regarder, car je sais que c'est ainsi que les pilotes implémentent les appels réels, et il est logique que chaque appel soit conservé dans l'oplog de cette manière.

Donc "dans son ensemble", alors non. Ce ne sont pas des "transactions" et ce sont toujours des opérations distinctes même si leur soumission et leur retour font l'objet d'une requête singulière. Mais ils ne le sont pas une opération singulière, et donc ne sera pas et ne doit pas être enregistrée comme telle.