MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDB:Груповите операции записват ли се в oplog като цяло?

Ще вляза в това с общото предупреждение, че признавам, че дори не съм погледнал резултатите, но основните принципи ми се струват валидни от самото начало.

Това, което трябва да обмислите тук, е "какво всъщност се случва под капака" на "хубавата синтактична захар", която ви се представя в общите разговори. Това означава основно да се види какво всъщност прави "командната форма" на операциите, които извиквате. В този случай "актуализация" .

Така че, ако вече сте разгледали тази връзка, помислете за следното "Групово " формуляр за актуализиране:

var bulk = db.collection.initializeOrdedBulkOp();

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

bulk.execute();

Сега вече знаете, че това се изпраща до сървъра като едно заявка, но това, което вероятно не обмисляте, е, че действителната „заявка“, направена „под капака“, всъщност е следната:

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

Следователно е логично това, което действително виждате в регистрационните файлове под операцията „актуализация“, всъщност да е нещо като (съкратено от пълен изход само до заявката):

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

Което следователно означава, че всяко от тези действия с асоциираната команда е в oplog за „повторно възпроизвеждане“ при репликация и/или при други действия, които може да извършите, като конкретно „повторно възпроизвеждане“ на записите в oplog.

Бих бил сигурен, че това всъщност се случва, без дори да гледам, защото знам, че това е начинът, по който драйверите изпълняват действителните повиквания и има смисъл всяко повикване да се съхранява в oplog по този начин.

Следователно "като цяло", тогава не. Това не са „транзакции“ и винаги са отделни операции, дори ако подаването и връщането им са в рамките на една заявка. Но не са единична операция и следователно няма и не трябва да се записва като такава.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Множество популации - mongoosejs

  2. Накарайте заявките за mongoose.js да се изпълняват синхронно

  3. Методът на примера на Mongoose е недефиниран

  4. Mongo сортиране по динамично поле

  5. указване на $push местоположение в колекция с помощта на Pymongo