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

MongoDB $set записва ли само полето или целия документ?

TL; DR:$inc гарантира актуализации на място, $set не, но при много специфични обстоятелства може да се направи и на място.

Подробности

Това има два аспекта:

  1. как минава през кабела?

    Информацията се изпраща като операция, $set остава $set така че е делта. Това важи и за oplog, който се използва за репликация. По този начин, използвайки $set е по-ефективен по отношение на честотната лента.

  2. как се актуализира на диск?

    MongoDB извършва актуализация на място ако и само ако ключът (полето) вече съществува , така че когато добавите ново поле към документ, това е по-голяма операция от простото присвояване на различна стойност на съществуващо поле.

    Дори тогава обаче стойностите трябва да имат еднакъв размер и не трябва да не променя типа и те трябва да са от тип double, long, int or bool , в противен случай не актуализация на място в момента.

Не съм сигурен как последното е наистина важно на практика , но сървърът определено използва напълно различни кодови пътища за двете, така че може например да доведе до пренареждане на полета. За много големи документи това вероятно ще доведе до измерима разлика в производителността.

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



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Дефиниране на схема на Mongodb

  2. Излъчваните променливи не се показват в дялове Apache Spark

  3. Индексът не се създава, текстов индекс е необходим за $text заявка - mongoose

  4. Намерете точно съвпадащ масив или имащ цялата стойност на масива в MongoDb

  5. Защо PyMongo 3 дава ServerSelectionTimeoutError?