The Replacement Trap — update() without Operators
db.users.update({ name: "Alice" }, { status: "active" })
db.users.updateOne({ name: "Alice" }, { $set: { status: "active" } })
db.users.replaceOne(
{ name: "Alice" },
{ name: "Alice", status: "active", email: "alice@example.com" }
)
Cannot Update _id
db.users.updateOne({ _id: 1 }, { $set: { _id: 2 } })
Nested Field Update on null Parent
db.users.updateOne({ _id: 1 }, { $set: { "address.city": "Mumbai" } })
db.users.updateOne({ _id: 1 }, { $set: { address: {} } })
db.users.updateOne({ _id: 1 }, { $set: { "address.city": "Mumbai" } })
NaN Behavior with $inc
db.data.updateOne({ _id: 1 }, { $inc: { value: 1 } })
db.data.updateOne({ _id: 1 }, { $set: { value: 0 } })
db.data.updateOne({ _id: 1 }, { $inc: { value: 1 } })
updateMany() Partial Failure
const session = db.getMongo().startSession()
session.startTransaction()
try {
db.getSiblingDB("mydb").orders.updateMany(
{ status: "pending" },
{ $set: { status: "processing" } },
{ session }
)
session.commitTransaction()
} catch(e) {
session.abortTransaction()
} finally {
session.endSession()
}
WARNA { status: null } filter in updateMany() targets documents where status is explicitly null AND documents where status is missing — this is the null/missing gotcha that can accidentally modify more docs than expected.