updateOne with upsert, or replaceOne?
updateOne with $set when the source sends partial documents; replaceOne when each staged document is complete and stale fields should disappear.
Gerador de upsert
Nomeie tabela, chave e colunas e receba a instrução que o MongoDB realmente aceita, com uma guarda para que uma linha antiga nunca sobrescreva uma nova. Abaixo: como a mecânica funciona, o que quebra e como a Datrise carrega o MongoDB de forma incremental.
As notas técnicas desta página estão em inglês.
Instrução · bulkWrite updateOne { upsert: true }
// staged: the fresh documents for this batch
const ops = staged.map((doc) => ({
updateOne: {
filter: { id: doc.id, updated_at: { $lt: doc.updated_at } },
update: {
$set: {
name: doc.name,
stage: doc.stage,
amount: doc.amount,
owner_id: doc.owner_id,
updated_at: doc.updated_at,
},
$setOnInsert: { id: doc.id },
},
upsert: true,
},
}));
await db.collection("deals").bulkWrite(ops, { ordered: false });MongoDB upserts with updateOne({ filter }, { $set }, { upsert: true }), and the efficient way to run thousands of them is a single bulkWrite with ordered: false so one failure does not stop the batch. The generated code sets only the listed fields, uses $setOnInsert for the key so new documents carry it, and matches on the business key. Every document keeps its own shape, so a field the source stopped sending stays until you $unset it.
Create a unique index on the key before the first load. Without it, two concurrent upserts for a key that does not exist yet can both insert, and you end up with duplicate documents that no later upsert will reconcile. With it, the loser gets an E11000 duplicate key error you retry. Keep field types consistent across documents; a string amount in one and a number in another breaks aggregation.
updateOne with $set when the source sends partial documents; replaceOne when each staged document is complete and stale fields should disappear.
Concurrent upserts raced on a key with no unique index. Add { unique: true } on the key and retry E11000 errors; the second attempt matches and updates.
Only when updated_at is monotonic per key. If the guard does not match because the stored document is newer, the upsert tries to insert and the unique index rejects it, which is the intended outcome.
A Datrise entrega entidades de CRM e SaaS no MongoDB com exatamente esta mecânica, uma marca d'água sobre updated-at e colunas tipadas, então a instrução acima é a que roda por você. Entre na lista de espera para acesso antecipado.
Explorar o catálogo de integrações