sql >> Databáze >  >> NoSQL >> MongoDB

Zapisuje MongoDB $set pouze pole nebo celý dokument?

TL;DR:$inc zaručuje aktualizace na místě, $set ne, ale za velmi specifických okolností to lze provést na místě.

Podrobnosti

To má dva aspekty:

  1. jak to jde přes drát?

    Informace je odeslána jako operace, $set zůstává $set takže je to delta. To platí také pro oplog, který se používá pro replikaci. Tímto způsobem pomocí $set je efektivnější s ohledem na šířku pásma.

  2. jak se aktualizuje na disku?

    MongoDB provede aktualizaci na místě pouze tehdy, pokud klíč (pole) již existuje , takže když do dokumentu přidáte nové pole, je to větší operace než pouhé přiřazení jiné hodnoty existujícímu poli.

    I potom však musí mít hodnoty stejnou velikost a nesmí neměnit typ a musí být typu double, long, int or bool , jinak to není aktuálně na místě aktualizace.

Nejsem si jistý, jak je to druhé skutečně důležité v praxi , ale server rozhodně používá zcela odlišné cesty kódu pro tyto dva, takže to může vést například k přeuspořádání polí. U velmi velkých dokumentů to pravděpodobně povede k měřitelnému rozdílu ve výkonu.

To ukazuje, že $inc se velmi liší v tom, že umožňuje pouze operace, které jsou jistě na místě, protože $inc funguje pouze na číselných typech a nemůže samozřejmě měnit velikost ani typ.



  1. Jak se dotazuji na odkazované objekty v MongoDB?

  2. Nelze dekódovat podhodnotu ObjectId z výsledků MongoDB v Golang

  3. mnoho pro mnoho vztah s nosql (mongodb a mongoose)

  4. Použití MongoDB a Neo4j dohromady