TL;DR:$inc
gwarantuje aktualizacje na miejscu, $set
nie, ale w bardzo szczególnych okolicznościach można to również zrobić na miejscu.
Szczegóły
Są na to dwa aspekty:
-
jak to przechodzi przez drut?
Informacja jest wysyłana jako operacja,
$set
pozostaje$set
więc to jest delta. Dotyczy to również oploga używanego do replikacji. W ten sposób, używając$set
jest bardziej wydajny w odniesieniu do przepustowości. -
jak jest aktualizowany na dysku?
MongoDB wykonuje aktualizację w miejscu wtedy i tylko wtedy, gdy klucz (pole) już istnieje , więc dodanie nowego pola do dokumentu jest większą operacją niż przypisanie innej wartości do istniejącego pola.
Jednak nawet wtedy wartości muszą mieć ten sam rozmiar i nie może zmieniać typu i muszą być tego samego typu
double, long, int or bool
, w przeciwnym razie nie aktualizacja na miejscu.
Nie jestem pewien, jak to drugie jest naprawdę ważne w praktyce , ale serwer zdecydowanie używa dla nich zupełnie innych ścieżek kodu, więc może to na przykład prowadzić do zmiany kolejności pól. W przypadku bardzo dużych dokumentów prawdopodobnie spowoduje to wymierną różnicę w wydajności.
To pokazuje, że $inc
bardzo różni się tym, że zezwala tylko na operacje, które z pewnością są na miejscu, ponieważ $inc
działa tylko na typach numerycznych i oczywiście nie może zmienić rozmiaru ani typu.