sql >> Database >  >> NoSQL >> MongoDB

Schrijft MongoDB $set alleen het veld of het hele document?

TL;DR:$inc garandeert interne updates, $set niet, maar onder zeer specifieke omstandigheden kan het ook ter plaatse worden gedaan.

Details

Dit heeft twee aspecten:

  1. hoe gaat het over de draad?

    De informatie wordt verzonden als een bewerking, een $set blijft een $set dus het is een delta. Dat geldt ook voor de oplog die voor replicatie wordt gebruikt. Op deze manier, met behulp van $set is efficiënter met betrekking tot bandbreedte.

  2. hoe wordt het bijgewerkt op schijf?

    MongoDB voert een in-place update uit als en alleen als de sleutel (veld) al bestaat , dus wanneer u een nieuw veld aan een document toevoegt, is dat een grotere operatie dan alleen het toewijzen van een andere waarde aan een bestaand veld.

    Maar zelfs dan moeten de waarden dezelfde grootte . hebben en mag niet van type veranderen en ze moeten van het type zijn double, long, int or bool , anders is het niet momenteel een interne update.

Ik weet niet zeker hoe dat laatste echt belangrijk is in de praktijk , maar de server gebruikt absoluut totaal verschillende codepaden voor de twee, dus dit kan bijvoorbeeld leiden tot het opnieuw ordenen van velden. Voor zeer grote documenten zal dat waarschijnlijk resulteren in een meetbaar prestatieverschil.

Dit laat zien dat $inc is heel anders omdat het alleen bewerkingen toestaat die zeker op hun plaats zijn, omdat $inc werkt alleen op numerieke typen en kan de grootte of het type natuurlijk niet wijzigen.



  1. Hoe worden de gegevens in een MongoDB-database op schijf opgeslagen?

  2. Java MongoDB Object Versiebeheer

  3. MongoDb upsert uitzondering ongeldig BSON-veld

  4. Hoe krijg ik een verzameling documenten van de mongodb-cursor?