sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB:Skrivs bulkoperationer till oploggen som helhet?

Jag kommer att gå in i detta med den allmänna varningen att jag erkänner att jag inte ens har tittat på resultaten, men de grundläggande principerna verkar giltiga för mig från början.

Vad du behöver tänka på här är "vad som faktiskt händer under huven" av det "fina syntaxsockret" du presenteras för i allmänna samtal. Vad detta betyder är i grunden att titta på vad "kommandoformen" för de operationer du ringer faktiskt gör. I det här fallet "uppdatering" .

Så om du redan har tittat på den länken, överväg följande "Bulk " uppdateringsformulär:

var bulk = db.collection.initializeOrdedBulkOp();

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

bulk.execute();

Nu vet du redan att detta skickas till servern som en begäran, men vad du troligen inte tänker på är att den faktiska "förfrågan" som görs "under huven" faktiskt är detta:

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

Därför är det naturligt att det du faktiskt ser i loggarna under "uppdatering"-operationen faktiskt är något i stil med (förkortat från full output till bara frågan):

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

Vilket därför innebär att var och en av dessa åtgärder med det associerade kommandot finns i oploggen för "replay" vid replikering och/eller på andra åtgärder du kan utföra, som att specifikt "spela om" oplog-posterna.

Jag skulle vara säker på att det är vad som faktiskt händer utan att ens titta, för jag vet att det är hur förarna implementerar de faktiska samtalen, och det är vettigt att varje samtal hålls inom oploggen på detta sätt.

Därför "som helhet", då nej. Dessa är inte "transaktioner" och är alltid distinkta operationer även om deras inlämning och retur är inom en enskild begäran. Men de är inte en singulär operation och därför inte kommer och bör inte registreras som sådan.




  1. Hur kan jag välja ett antal poster per ett specifikt fält med mongodb?

  2. Många-till-många-relationer i CouchDB eller MongoDB

  3. Redis - Fel:värdet är inte ett giltigt flytande

  4. Enkel HTTP/TCP-hälsokontroll för MongoDB