Inserting Documents

1. Inserting Single Document

MethodReturns
insertOne(doc){ acknowledged, insertedId }
insertOne(doc, {writeConcern})Same with custom w

Example: Insert with explicit _id

const result = await db.users.insertOne({
  _id: new ObjectId(),
  email: "alice@example.com",
  createdAt: new Date(),
});
console.log(result.insertedId);

2. Inserting Multiple Documents

MethodDescription
insertMany(docs)Bulk insert, default ordered
{ordered: false}Continue on errors
Batch sizeServer-limited to 100k docs / 48MB per batch
const r = await db.events.insertMany(
  [{type: "a"}, {type: "b"}, {type: "c"}],
  { ordered: false, writeConcern: { w: "majority" } }
);
console.log(r.insertedCount, r.insertedIds);

3. Using Ordered Inserts

orderedBehavior on error
true (default)Stops at first error; remaining docs skipped
falseAttempts all docs; reports each error

4. Handling Insert Errors

CodeMeaning
11000Duplicate key
121Document failed validation
2BadValue (invalid BSON)
10334Document too large (>16MB)
17280Key too large for index
try { await db.users.insertOne({email: "a"}); }
catch (e) { if (e.code === 11000) console.log("duplicate", e.keyValue); }

5. Setting Write Concern

wEffect
0No acknowledgment (fire-and-forget)
1 (default)Primary ack only
"majority"Majority of voting members ack
<N>N members ack
tagCustom (e.g., DC-aware)
j: trueWait for journal commit
wtimeoutms to wait before failing

6. Using _id Field

AspectDetail
DefaultAuto ObjectId if not provided
Allowed typesAny BSON type EXCEPT array
ImmutableCannot be updated after insert
Unique indexAlways present on _id
CompositeUse embedded document: {_id: {a:1,b:2}}

7. Inserting with Upsert

OperationUse
updateOne(filter, update, {upsert: true})Insert if missing
replaceOne(filter, doc, {upsert: true})Replace or insert
findOneAndUpdate(...{upsert:true, returnDocument:"after"})Atomic get-or-create
$setOnInsertFields set only on insert path

8. Using Bulk Write Operations

OpDescription
insertOneSingle insert
updateOne / updateManyUpdate
replaceOneReplace doc
deleteOne / deleteManyDelete
await db.orders.bulkWrite([
  { insertOne: { document: { sku: "A", qty: 1 } } },
  { updateOne: { filter: { sku: "B" }, update: { $inc: { qty: 1 } }, upsert: true } },
  { deleteMany: { filter: { status: "cancelled" } } },
], { ordered: false });

9. Handling Duplicate Key Errors

StrategyExample
Catch & ignoreif (e.code === 11000) return existing;
UpsertupdateOne(..., {upsert: true})
Unordered batchinsertMany(docs, {ordered: false})
Inspecte.keyPattern, e.keyValue

10. Inserting Nested Documents

AspectDetail
Depth limit100 levels
Size limitSingle doc ≤ 16MB
QueryUse dot notation: "address.zip"

11. Using Retryable Writes

AspectDetail
URI optionretryWrites=true (default in modern drivers)
ScopeSingle-document writes (insertOne, updateOne, deleteOne, findAndModify)
TriggerNetwork errors, primary stepdown
RetriesExactly one retry, server-deduped via session+txnNumber
Not retriedupdateMany, deleteMany, bulkWrite (with multi)