TL;DR:
$inc
garante atualizações no local, $set
não, mas em circunstâncias muito específicas também pode ser feito no local. Detalhes
Existem dois aspectos para isso:
-
como passa pelo fio?
A informação é enviada como uma operação, um$set
permanece um$set
então é um delta. Isso também é verdade para o oplog usado para replicação. Desta forma, usando$set
é mais eficiente em relação à largura de banda.
-
como é atualizado no disco?
O MongoDB executa uma atualização no local se e somente se a chave (campo) já existir , portanto, quando você adiciona um novo campo a um documento, essa é uma operação maior do que apenas atribuir um valor diferente a um campo existente.
Mesmo assim, no entanto, os valores devem ter o mesmo tamanho e não deve alterar o tipo e eles devem ser do tipodouble, long, int or bool
, caso contrário, não uma atualização in-loco atualmente.
Não tenho certeza de como o último é realmente importante na prática , mas o servidor definitivamente usa caminhos de código completamente diferentes para os dois, então pode, por exemplo, levar à reordenação de campos. Para documentos muito grandes, isso provavelmente resultará em uma diferença mensurável no desempenho.
Isso mostra que
$inc
é muito diferente, pois só permite operações que certamente estão no local, porque $inc
só opera em tipos numéricos e não pode alterar tamanho ou tipo, naturalmente.