A finalidade da chave de versão é o bloqueio otimista.
Quando ativado, o valor da versão é incrementado atomicamente sempre que um documento é atualizado.
Isso permite que o código do seu aplicativo teste se foram feitas alterações entre uma busca (trazendo a chave de versão 42, por exemplo) e uma atualização consequente (garantindo que o valor da versão ainda seja 42). Se a chave da versão tiver um valor diferente (por exemplo, 43 porque um foi feita uma atualização no documento), o código do aplicativo pode lidar com a modificação simultânea.
O mesmo conceito é frequentemente usado em bancos de dados relacionais em vez de travamento pessimista que pode trazer um desempenho horrível. Todos os ORMs decentes fornecem esse recurso. Por exemplo, está bem descrito na documentação do ObjectDB . É um banco de dados de objetos implementado em Java, mas o mesmo conceito se aplica.
A postagem do blog vinculados no comentário de Behlül demonstram a utilidade do bloqueio otimista com um exemplo concreto, mas apenas para alterações de matrizes, veja abaixo.
Pelo contrário, aqui está um caso simples onde é inútil:um perfil de usuário que pode ser editado por seu proprietário. Aqui você pode se livrar do bloqueio otimista e assumir que a última edição sempre vence.
Assim, só você sabe se sua aplicação precisa ou não de bloqueio otimista. Caso de uso por caso de uso.
A situação do Mongoose é um tanto especial.
O bloqueio otimista é habilitado apenas para arrays porque o formato de armazenamento interno usa o índice posicional. Este é o problema descrito pela postagem do blog link no comentário da pergunta. Encontrei a explicação dado no
mongoose-orm
lista de discussão bem clara:se você precisa de bloqueio otimista para outros campos, você precisa lidar com isso sozinho. Aqui está um gist mostrando como implementar uma estratégia de repetição para um
add
Operação. Novamente, como você deseja lidar com isso depende de seus casos de uso, mas deve ser suficiente para você começar. Eu espero que isso esclareça as coisas.
Felicidades