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

FindOrCreate atômico do MongoDB:findOne, insira se não existir, mas não atualize


A partir do MongoDB 2.4, não é mais necessário contar com um índice exclusivo (ou qualquer outra solução alternativa) para findOrCreate atômico como operações.

Isso é graças ao $setOnInsert operador novo para 2.4, que permite especificar atualizações que devem ocorrer apenas na inserção de documentos.

Isso, combinado com o upsert opção, significa que você pode usar findAndModify para alcançar um findOrCreate atômico -como operação.
db.collection.findAndModify({
  query: { _id: "some potentially existing id" },
  update: {
    $setOnInsert: { foo: "bar" }
  },
  new: true,   // return new doc if one is upserted
  upsert: true // insert the document if it does not exist
})

Como $setOnInsert afeta apenas os documentos que estão sendo inseridos, se um documento existente for encontrado, nenhuma modificação ocorrerá. Se não existir nenhum documento, ele fará o upsert de um com o _id especificado e, em seguida, executará apenas a inserção definida. Em ambos os casos, o documento é devolvido.