MongoDB / deleteOne ба deleteMany

deleteOne ба deleteMany

MongoDB-д document-уудыг устгахад deleteOne ба deleteMany командуудыг ашигладаг. Устгал буцаах боломжгүй тул шүүлтээ үргэлж find-ээр урьдчилан шалгах нь зөв дадал юм.

deleteOne

deleteOne нь шүүлтэд тохирох эхний нэг document-ийг устгана.

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

// username нь "bold_bataa" хэрэглэгчийг устгах
db.users.deleteOne({ username: "bold_bataa" });

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

javascript
{
  acknowledged: true,
  deletedCount: 1   // устгагдсан document-ийн тоо
}

deletedCount: 0 бол шүүлтэд тохирох document олдоогүй гэсэн үг.

deleteMany

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

javascript
// status нь "inactive" байгаа бүх хэрэглэгчийг устгах
db.users.deleteMany({ status: "inactive" });

// 2024 оноос өмнө үүссэн бүх бичлэгийг устгах
db.logs.deleteMany({
  createdAt: { $lt: new Date("2024-01-01") },
});

Бүх document-уудыг устгах

Хоосон шүүлт {} өгвөл collection-ийн бүх document устгагдана — гэхдээ collection өөрөө үлдэнэ.

javascript
// Анхааруул: бүх document устгагдана
db.temp_logs.deleteMany({});

Collection устгах — drop()

drop() нь collection-ийг index-үүдийн хамт бүхэлд нь устгана.

javascript
// temp_logs collection-ийг бүхэлд нь устгах
db.temp_logs.drop();

deleteMany({}) болон drop()-ийн ялгаа:

| | deleteMany({}) | drop() | | ---------- | -------------- | ------- | | Document | Устгана | Устгана | | Collection | Үлдэнэ | Устгана | | Index | Үлдэнэ | Устгана | | Хурд | Удаан | Хурдан |

Бүх document устгахад drop() хурдан боловч дараа нь collection дахин үүснэ.

Устгалаас өмнө шалгах

Устгахаасаа өмнө find-ээр ямар document-ууд устгагдахыг харах нь сайн дадал:

javascript
// Эхлээд шалгана
db.users.find({ status: "inactive" });

// Үр дүнд сэтгэл хангалуун бол устгана
db.users.deleteMany({ status: "inactive" });

Soft delete загвар

Бодит аппликейшнд ихэвчлэн document-уудыг физикаар устгадаггүй — харин deleted: true тэмдэглэгдэж "нуугдана". Энэ загварыг soft delete гэнэ.

Яагаад soft delete ашиглах вэ?

  • Устгасан өгөгдлийг сэргээх боломжтой
  • Аудит, түүх хадгалах
  • Харилцааны бүрэн бүтэн байдлыг хамгаалах
javascript
// Физик устгалын оронд deleted тэмдэглэх
db.users.updateOne(
  { _id: userId },
  {
    $set: {
      deleted: true,
      deletedAt: new Date(),
    },
  },
);

// Идэвхтэй хэрэглэгчдийг query хийхдээ deleted биш гэдгийг шалгана
db.users.find({ deleted: { $ne: true } });

Жишээ: Хаясан сагс цэвэрлэх

javascript
// 30 хоногоос дээш хугацаатай хаясан сагсны бараануудыг устгах
const thirtyDaysAgo = new Date();
thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30);

db.carts.deleteMany({
  status: "abandoned",
  updatedAt: { $lt: thirtyDaysAgo },
});

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

Projection ашиглан query-ийн үр дүнд зөвхөн хэрэгтэй талбаруудаа сонгон авах талаар үзнэ.