MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

O MongoDB $set escreve apenas o campo ou o documento inteiro?


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:

  1. 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.

  2. 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 tipo double, 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.