Inserir ou atualizar em uma única operação
Visão geral
Se seu aplicativo armazena e modifica dados no MongoDB, você provavelmente usa
operações de inserção e atualização. Em determinados fluxos de trabalho, independentemente de você executar
uma operação de inserção ou atualização depende da existência do documento. Nesses casos, você pode simplificar a lógica do aplicativo 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 coleta. Em vez de primeiro consultar se ele existe para determinar se deve 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" }, ... ]