MongoDB / Update operator ($set, $push, $inc)

Update operator ($set, $push, $inc)

updateOne ба updateMany-д өгөх өөрчлөлтийн хэсгийг update operator-уудаар тодорхойлно. Оператор сонголтоос шалтгаалан MongoDB document-ийн янз бүрийн хэсгийг өөр өөрөөр шинэчилнэ.

Талбарын операторууд (Field)

$set — утга тавих

$set нь талбарын утгыг шинэчилнэ. Талбар байхгүй бол шинээр нэмнэ.

javascript
// Нэг талбар өөрчлөх
db.users.updateOne({ username: "bold" }, { $set: { age: 26 } });

// Олон талбар нэгэн зэрэг өөрчлөх
db.users.updateOne(
  { username: "bold" },
  { $set: { age: 26, city: "Дархан", updatedAt: new Date() } },
);

// Nested талбар өөрчлөх (dot notation)
db.users.updateOne(
  { username: "bold" },
  { $set: { "profile.bio": "MongoDB хөгжүүлэгч" } },
);

$unset — талбар устгах

javascript
// phone талбарыг document-ээс устгах
db.users.updateOne(
  { username: "bold" },
  { $unset: { phone: "" } }, // утга нь хамаагүй, "" өгч болно
);

$inc — тоон утга нэмэх/хасах

$inc нь одоогийн утга дээр өгөгдсөн тоог нэмнэ. Сөрөг тоо өгвөл хасна.

javascript
// xp талбарт 10 нэмэх
db.users.updateOne({ username: "bold" }, { $inc: { xp: 10 } });

// Үзэлтийн тоо 1-ээр нэмэх
db.posts.updateOne({ _id: ObjectId("64abc123") }, { $inc: { viewCount: 1 } });

// stock-оос 3 хасах
db.products.updateOne({ _id: productId }, { $inc: { stock: -3 } });

$mul — үржүүлэх

javascript
// price-ийг 1.1-ээр үржүүлэх (10% нэмэгдүүлэх)
db.products.updateOne({ _id: productId }, { $mul: { price: 1.1 } });

$rename — талбарын нэр өөрчлөх

javascript
// "city" талбарыг "location" болгон нэрлэх
db.users.updateMany({}, { $rename: { city: "location" } });

Массивын операторууд (Array)

$push — массивт элемент нэмэх

javascript
// skills массивт "MongoDB" нэмэх
db.users.updateOne({ username: "bold" }, { $push: { skills: "MongoDB" } });

$each ашиглан нэг удаа олон элемент нэмж болно:

javascript
db.users.updateOne(
  { username: "bold" },
  { $push: { skills: { $each: ["Docker", "Git"] } } },
);

$pull — массиваас элемент устгах

javascript
// skills массиваас "PHP" устгах
db.users.updateOne({ username: "bold" }, { $pull: { skills: "PHP" } });

// Нөхцөлтэйгөөр устгах
db.users.updateOne(
  { username: "bold" },
  { $pull: { scores: { $lt: 50 } } }, // 50-аас бага score бүгдийг устгах
);

$addToSet — давхардалгүйгээр нэмэх

$push-тай адил боловч элемент аль хэдийн байвал нэмэхгүй.

javascript
// "JavaScript" аль хэдийн байвал давхар нэмэхгүй
db.users.updateOne(
  { username: "bold" },
  { $addToSet: { skills: "JavaScript" } },
);

$pop — массивын эхэн/төгсгөлийн элемент устгах

javascript
// Сүүлчийн элемент устгах (1)
db.users.updateOne({ username: "bold" }, { $pop: { skills: 1 } });

// Эхний элемент устгах (-1)
db.users.updateOne({ username: "bold" }, { $pop: { skills: -1 } });

Операторуудыг хослуулах

Нэг update дотор олон оператор нэгэн зэрэг ашиглаж болно:

javascript
// Хичээл дуусгасан хэрэглэгч шинэчлэх:
// — XP нэмэх
// — Дуусгасан хичээлийг жагсаалтад нэмэх
// — Сүүлд идэвхтэй байсан огноо тэмдэглэх
db.users.updateOne(
  { _id: userId },
  {
    $inc: { xp: 10 },
    $addToSet: { completedLessons: "mongodb-07" },
    $set: { lastActive: new Date() },
  },
);

Дараагийн хичээлд:

deleteOne ба deleteMany ашиглан document-уудыг хэрхэн устгах талаар үзнэ.