This guide covers essential MongoDB update operations commonly asked in technical interviews. Each question includes detailed answers and practical examples.
MongoDB provides several types of update operations:
MongoDB update modifiers are special operators that modify document fields:
// $set: Sets the value of a field
db.users.updateOne(
{ email: "john@example.com" },
{ $set: { status: "active" } }
)
// $unset: Removes a field
db.users.updateOne(
{ email: "john@example.com" },
{ $unset: { tempField: "" } }
)
// $rename: Renames a field
db.users.updateOne(
{ email: "john@example.com" },
{ $rename: { "oldField": "newField" } }
)
// $push: Adds elements to an array
db.users.updateOne(
{ email: "john@example.com" },
{ $push: { roles: "admin" } }
)
// $addToSet: Adds unique elements to an array
db.users.updateOne(
{ email: "john@example.com" },
{ $addToSet: { roles: "user" } }
)
// $pull: Removes elements from an array
db.users.updateOne(
{ email: "john@example.com" },
{ $pull: { roles: "temp" } }
)
Atomic updates in MongoDB ensure operations are performed as a single unit:
// $inc: Increment a field
db.users.updateOne(
{ email: "john@example.com" },
{ $inc: { loginCount: 1 } }
)
// $mul: Multiply a field
db.users.updateOne(
{ email: "john@example.com" },
{ $mul: { points: 1.5 } }
)
// $min/$max: Update if new value is min/max
db.users.updateOne(
{ email: "john@example.com" },
{ $min: { highScore: 100 } }
)
// Start a session
const session = client.startSession();
try {
session.startTransaction();
// Perform multiple operations
await db.users.updateOne(
{ email: "john@example.com" },
{ $set: { status: "inactive" } },
{ session }
);
await db.logs.insertOne({
action: "deactivate",
userId: "john@example.com",
timestamp: new Date()
}, { session });
await session.commitTransaction();
} catch (error) {
await session.abortTransaction();
throw error;
} finally {
session.endSession();
}
Best practices for MongoDB update operations include:
// Best practice: Use atomic operators
db.users.updateOne(
{ email: "john@example.com" },
{
$set: { status: "active" },
$inc: { loginCount: 1 },
$currentDate: { lastLogin: true }
}
)
// Best practice: Use upsert option
db.users.updateOne(
{ email: "john@example.com" },
{ $set: { status: "active" } },
{ upsert: true }
)
// Best practice: Use write concern
db.users.updateOne(
{ email: "john@example.com" },
{ $set: { status: "active" } },
{
writeConcern: { w: "majority", wtimeout: 5000 }
}
)
// Best practice: Use bulk operations
db.users.bulkWrite([
{
updateOne: {
filter: { status: "inactive" },
update: { $set: { status: "active" } }
}
},
{
updateMany: {
filter: { lastLogin: { $lt: new Date() } },
update: { $set: { status: "inactive" } }
}
}
])
Complex update scenarios require careful consideration of:
// Update based on conditions
db.users.updateOne(
{
email: "john@example.com",
status: "active",
lastLogin: { $lt: new Date() }
},
{
$set: { status: "inactive" },
$push: {
history: {
action: "deactivate",
reason: "inactivity",
timestamp: new Date()
}
}
}
)
// Update array elements
db.users.updateOne(
{
email: "john@example.com",
"orders.status": "pending"
},
{
$set: { "orders.$.status": "processing" },
$currentDate: { "orders.$.updatedAt": true }
}
)
// Update multiple array elements
db.users.updateOne(
{ email: "john@example.com" },
{
$set: {
"orders.$[elem].status": "completed",
"orders.$[elem].completedAt": new Date()
}
},
{
arrayFilters: [{ "elem.status": "processing" }]
}
)
Continue your MongoDB interview preparation with: