updateOne ба updateMany
Өгөгдлийг MongoDB-д өөрчлөхийн тулд updateOne ба updateMany командуудыг ашигладаг. Эдгээр нь хоёр аргумент авдаг: шүүлт (filter) ба өөрчлөлт (update).
updateOne
updateOne нь шүүлтэд тохирох эхний document-ийг өөрчилнэ.
// Хэлбэр:
db.collection.updateOne(
{
/* шүүлт */
},
{
/* өөрчлөлт */
},
);
// Жишээ: username нь "bold_bataa" хэрэглэгчийн нас-ыг 26 болгох
db.users.updateOne({ username: "bold_bataa" }, { $set: { age: 26 } });
Буцаасан үр дүн:
{
acknowledged: true,
matchedCount: 1, // шүүлтэд тохирсон document-ийн тоо
modifiedCount: 1, // өөрчлөгдсөн document-ийн тоо
upsertedId: null
}
matchedCount: 1 боловч modifiedCount: 0 байж болно — утга нь аль хэдийн ижил байсан үед.
updateMany
updateMany нь шүүлтэд тохирох бүх document-уудыг өөрчилнэ.
// status нь "pending" байгаа бүх хэрэглэгчийн status-ийг "active" болгох
db.users.updateMany({ status: "pending" }, { $set: { status: "active" } });
Буцаасан үр дүн:
{
acknowledged: true,
matchedCount: 42, // 42 document тохирсон
modifiedCount: 42 // 42 document өөрчлөгдсөн
}
upsert — олдохгүй бол шинэ document үүсгэх
upsert: true тохируулбал шүүлтэд тохирох document олдоогүй тохиолдолд шинэ document үүснэ.
db.users.updateOne(
{ username: "shagai_od" },
{ $set: { username: "shagai_od", email: "shagai@example.com", age: 22 } },
{ upsert: true },
);
Хэрэв shagai_od олдвол шинэчилнэ, олдохгүй бол шинэ document үүсгэнэ. Буцаасан үр дүн дэх upsertedId нь шинэ document-ийн _id-г харуулна.
replaceOne — document-ийг бүхэлд нь сольх
replaceOne нь тохирсон document-ийг шинэ document-ээр бүхэлд нь сольдог — _id-с бусад бүх талбар өөрчлөгдөнө.
// Анхны document:
// { _id: ObjectId("..."), username: "bold", age: 25, city: "УБ" }
db.users.replaceOne(
{ username: "bold" },
{ username: "bold_bataa", email: "bold@example.com" },
);
// Үр дүн:
// { _id: ObjectId("..."), username: "bold_bataa", email: "bold@example.com" }
// city талбар арилсан!
Талбаруудыг хадгалан зөвхөн тодорхой хэсгийг өөрчлөхийн тулд replaceOne-ийн оронд updateOne + $set ашигла.
matchedCount vs modifiedCount
// Хэрэглэгчийн одоогийн утга: { age: 25 }
db.users.updateOne(
{ username: "bold" },
{ $set: { age: 25 } }, // Яг ижил утга тавьж байна
);
// Үр дүн:
// matchedCount: 1 ← document олдсон
// modifiedCount: 0 ← гэхдээ утга өөрчлөгдөөгүй (адилхан байсан)
Жишээ: Бодит хэрэглээ
// 1. Нэг хэрэглэгчийн и-мэйл шинэчлэх
db.users.updateOne(
{ _id: ObjectId("64abc1234567") },
{ $set: { email: "new_email@example.com" } },
);
// 2. Бүх идэвхгүй хэрэглэгчийг устгагдсан гэж тэмдэглэх
db.users.updateMany(
{ status: "inactive" },
{ $set: { deleted: true, deletedAt: new Date() } },
);
// 3. Хэрэглэгч байхгүй бол шинэ үүсгэх
db.sessions.updateOne(
{ userId: "user_123", date: "2025-01-15" },
{ $set: { active: true } },
{ upsert: true },
);
Дараагийн хичээлд:
$set, $push, $inc зэрэг update operator-уудыг дэлгэрэнгүй үзнэ.