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

MongoDB:Er masseoperationer skrevet til oploggen som helhed?

Jeg vil gå ind i dette med det generelle forbehold, at jeg indrømmer, at jeg ikke engang har set på resultaterne, men de grundlæggende principper synes at være gyldige for mig fra starten.

Det du skal overveje her er "hvad der egentlig sker under motorhjelmen" af det "pæne syntakssukker", du bliver præsenteret for i almindelige opkald. Hvad dette betyder er dybest set at se på, hvad "kommandoformen" af de operationer, du ringer til, rent faktisk gør. I dette tilfælde "update" .

Så hvis du allerede havde et kig på det link, så overvej følgende "Bulk " opdateringsformular:

var bulk = db.collection.initializeOrdedBulkOp();

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

bulk.execute();

Nu ved du allerede, at dette bliver sendt til serveren som en anmodning, men hvad du sandsynligvis ikke overvejer er, at den faktiske "anmodning" lavet "under motorhjelmen" faktisk er dette:

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

Derfor er det naturligt, at det, du rent faktisk ser i logfilerne under "opdatering"-operationen, faktisk er noget i retning af (forkortet fra fuld output til kun forespørgslen):

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

Hvilket derfor betyder, at hver af disse handlinger med den tilknyttede kommando er i oploggen for "genafspilning" på replikering og/eller på andre handlinger, du kan udføre, såsom specifikt "genafspilning" af oplogposterne.

Jeg vil være sikker på, at det er det, der rent faktisk sker uden at kigge efter, for jeg ved, at det er, hvordan chaufførerne implementerer de faktiske opkald, og det giver mening, at hvert opkald holdes inden for oploggen på denne måde.

Derfor "som helhed", så nej. Disse er ikke "transaktioner" og er altid særskilte operationer, selvom deres indsendelse og returnering er inden for en enkelt anmodning. Men det er de ikke en enkelt operation, og vil og bør derfor ikke registreres som sådan.




  1. hvordan overføres variabler $tid, $id til rå funktion?

  2. Hvordan udføres addToSet ved hjælp af Go officiel driver?

  3. Korrekt måde at importere json-fil til mongo

  4. Mongoose:forespørg om fulde navn med regex