sql >> Database >  >> NoSQL >> MongoDB

MongoDB:Worden bulkbewerkingen naar de oplog als geheel geschreven?

Ik zal hierop ingaan met het algemene voorbehoud dat ik toegeef dat ik niet eens naar de resultaten heb gekeken, maar de basisprincipes lijken mij vanaf het begin geldig.

Wat u hier moet overwegen, is "wat er feitelijk onder de motorkap gebeurt" van de "mooie syntaxissuiker" die u in algemene gesprekken te zien krijgt. Wat dit betekent, is in feite kijken naar wat de "opdrachtvorm" van de bewerkingen die u aanroept eigenlijk doen. In dit geval "update" .

Dus als je die link al hebt bekeken, overweeg dan de volgende "Bulk " formulier bijwerken:

var bulk = db.collection.initializeOrdedBulkOp();

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

bulk.execute();

Nu weet je al dat dit naar de server wordt verzonden als één verzoek, maar wat u waarschijnlijk niet overweegt, is dat het werkelijke "verzoek" dat "onder de motorkap" wordt gedaan eigenlijk dit is:

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

Daarom is het logisch dat wat u daadwerkelijk ziet in de logs onder de "update"-bewerking eigenlijk zoiets is als (afgekort van volledige uitvoer tot alleen de query):

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

Wat daarom betekent dat elk van die acties met het bijbehorende commando in de oplog staat voor "replay" bij replicatie en/of bij andere acties die u zou kunnen uitvoeren, zoals het specifiek "replayen" van de oplog-vermeldingen.

Ik weet zeker dat dat is wat er gebeurt zonder zelfs maar te kijken, omdat ik weet hoe de stuurprogramma's de daadwerkelijke oproepen implementeren, en het is logisch dat elke oproep op deze manier binnen de oplog wordt gehouden.

Dus "als geheel", dan niet. Dit zijn geen "transacties" en zijn altijd afzonderlijke operaties, zelfs als hun indiening en teruggave binnen een enkelvoudig verzoek vallen. Maar ze zijn niet een enkelvoudige operatie, en zal en mag daarom niet als zodanig worden vastgelegd.




  1. Hoe gebruik je $ set en puntnotatie om ingesloten array-elementen bij te werken met het overeenkomstige oude element?

  2. mongodb-updates worden niet weergegeven tenzij ik de node-server opnieuw start

  3. Unit testen met MongoDB

  4. Meerdere records opwaarderen met MongoDb