MongoDB / updateOne ба updateMany

updateOne ба updateMany

Өгөгдлийг MongoDB-д өөрчлөхийн тулд updateOne ба updateMany командуудыг ашигладаг. Эдгээр нь хоёр аргумент авдаг: шүүлт (filter) ба өөрчлөлт (update).

updateOne

updateOne нь шүүлтэд тохирох эхний document-ийг өөрчилнэ.

javascript
// Хэлбэр:
db.collection.updateOne(
  {
    /* шүүлт */
  },
  {
    /* өөрчлөлт */
  },
);

// Жишээ: username нь "bold_bataa" хэрэглэгчийн нас-ыг 26 болгох
db.users.updateOne({ username: "bold_bataa" }, { $set: { age: 26 } });

Буцаасан үр дүн:

javascript
{
  acknowledged: true,
  matchedCount: 1,    // шүүлтэд тохирсон document-ийн тоо
  modifiedCount: 1,   // өөрчлөгдсөн document-ийн тоо
  upsertedId: null
}

matchedCount: 1 боловч modifiedCount: 0 байж болно — утга нь аль хэдийн ижил байсан үед.

updateMany

updateMany нь шүүлтэд тохирох бүх document-уудыг өөрчилнэ.

javascript
// status нь "pending" байгаа бүх хэрэглэгчийн status-ийг "active" болгох
db.users.updateMany({ status: "pending" }, { $set: { status: "active" } });

Буцаасан үр дүн:

javascript
{
  acknowledged: true,
  matchedCount: 42,   // 42 document тохирсон
  modifiedCount: 42   // 42 document өөрчлөгдсөн
}

upsert — олдохгүй бол шинэ document үүсгэх

upsert: true тохируулбал шүүлтэд тохирох document олдоогүй тохиолдолд шинэ document үүснэ.

javascript
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-с бусад бүх талбар өөрчлөгдөнө.

javascript
// Анхны 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

javascript
// Хэрэглэгчийн одоогийн утга: { age: 25 }
db.users.updateOne(
  { username: "bold" },
  { $set: { age: 25 } }, // Яг ижил утга тавьж байна
);

// Үр дүн:
// matchedCount: 1    ← document олдсон
// modifiedCount: 0   ← гэхдээ утга өөрчлөгдөөгүй (адилхан байсан)

Жишээ: Бодит хэрэглээ

javascript
// 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-уудыг дэлгэрэнгүй үзнэ.