Inserir ou atualizar em uma única operação
Visão geral
Se a sua aplicação armazena e modifica dados no MongoDB, provavelmente utiliza operações de inserção e atualização. Em determinados fluxos de trabalho, talvez seja necessário escolher entre inserir e atualizar, dependendo da existência do documento . Nesses casos, você pode simplificar a lógica do aplicação usando a opção upsert
disponível nos seguintes métodos:
Se o filtro de consulta passado para esses métodos não encontrar nenhuma correspondência e você definir a opção upsert
como true
, o MongoDB insere o documento atualizado. Vejamos um exemplo.
Executando uma atualização
Suponha que seu aplicativo rastreie a localização atual de food trucks, armazenando os dados do endereço mais próximo na coleta myDB.foodTrucks
, que se parece com o seguinte:
[ { name: "Haute Skillet", address: "42 Avenue B" }, { name: "Lady of the Latke", address: "35 Fulton Rd" }, ... ]
Como usuário do aplicativo, você leu sobre um food truck mudando seu local normal e deseja aplicar a atualização. Esta atualização pode ser semelhante a :
const myDB = client.db("myDB"); const myColl = myDB.collection("foodTrucks"); const query = { name: "Deli Llama" }; const update = { $set: { name: "Deli Llama", address: "3 Nassau St" }}; const options = {}; myColl.updateOne(query, update, options);
Se houver um caminhão de alimentação chamado "Deli Llama", o método chamado acima atualizará o documento na coleta. No entanto, se não houver nenhum food truck chamado "Deli Llama" em sua coleção, nenhuma alteração será feita.
Executando um upsert
Considere o caso em que você deseja adicionar informações sobre o food truck mesmo que ele não exista atualmente em sua collection. Em vez de primeiro consultar se ele existe para determinar se precisamos inserir ou atualizar o documento, podemos definir upsert
para true
em nossa chamada para updateOne()
da seguinte forma:
const query = { name: "Deli Llama" }; const update = { $set: { name: "Deli Llama", address: "3 Nassau St" }}; const options = { upsert: true }; myColl.updateOne(query, update, options);
Depois de executar a operação acima, sua coleção deve ser semelhante ao seguinte, se o documento "Deli Llama" existia em sua coleção antecipadamente:
[ { name: "Haute Skillet", address: "42 Avenue B" }, { name: "Lady of the Latke", address: "35 Fulton Rd" }, { name: "Deli Llama", address: "3 Nassau St" }, ... ]