deleteOne ба deleteMany
MongoDB-д document-уудыг устгахад deleteOne ба deleteMany командуудыг ашигладаг. Устгал буцаах боломжгүй тул шүүлтээ үргэлж find-ээр урьдчилан шалгах нь зөв дадал юм.
deleteOne
deleteOne нь шүүлтэд тохирох эхний нэг document-ийг устгана.
// Хэлбэр:
db.collection.deleteOne({
/* шүүлт */
});
// username нь "bold_bataa" хэрэглэгчийг устгах
db.users.deleteOne({ username: "bold_bataa" });
Буцаасан үр дүн:
{
acknowledged: true,
deletedCount: 1 // устгагдсан document-ийн тоо
}
deletedCount: 0 бол шүүлтэд тохирох document олдоогүй гэсэн үг.
deleteMany
deleteMany нь шүүлтэд тохирох бүх document-уудыг устгана.
// status нь "inactive" байгаа бүх хэрэглэгчийг устгах
db.users.deleteMany({ status: "inactive" });
// 2024 оноос өмнө үүссэн бүх бичлэгийг устгах
db.logs.deleteMany({
createdAt: { $lt: new Date("2024-01-01") },
});
Бүх document-уудыг устгах
Хоосон шүүлт {} өгвөл collection-ийн бүх document устгагдана — гэхдээ collection өөрөө үлдэнэ.
// Анхааруул: бүх document устгагдана
db.temp_logs.deleteMany({});
Collection устгах — drop()
drop() нь collection-ийг index-үүдийн хамт бүхэлд нь устгана.
// temp_logs collection-ийг бүхэлд нь устгах
db.temp_logs.drop();
deleteMany({}) болон drop()-ийн ялгаа:
| | deleteMany({}) | drop() | | ---------- | -------------- | ------- | | Document | Устгана | Устгана | | Collection | Үлдэнэ | Устгана | | Index | Үлдэнэ | Устгана | | Хурд | Удаан | Хурдан |
Бүх document устгахад drop() хурдан боловч дараа нь collection дахин үүснэ.
Устгалаас өмнө шалгах
Устгахаасаа өмнө find-ээр ямар document-ууд устгагдахыг харах нь сайн дадал:
// Эхлээд шалгана
db.users.find({ status: "inactive" });
// Үр дүнд сэтгэл хангалуун бол устгана
db.users.deleteMany({ status: "inactive" });
Soft delete загвар
Бодит аппликейшнд ихэвчлэн document-уудыг физикаар устгадаггүй — харин deleted: true тэмдэглэгдэж "нуугдана". Энэ загварыг soft delete гэнэ.
Яагаад soft delete ашиглах вэ?
- Устгасан өгөгдлийг сэргээх боломжтой
- Аудит, түүх хадгалах
- Харилцааны бүрэн бүтэн байдлыг хамгаалах
// Физик устгалын оронд deleted тэмдэглэх
db.users.updateOne(
{ _id: userId },
{
$set: {
deleted: true,
deletedAt: new Date(),
},
},
);
// Идэвхтэй хэрэглэгчдийг query хийхдээ deleted биш гэдгийг шалгана
db.users.find({ deleted: { $ne: true } });
Жишээ: Хаясан сагс цэвэрлэх
// 30 хоногоос дээш хугацаатай хаясан сагсны бараануудыг устгах
const thirtyDaysAgo = new Date();
thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30);
db.carts.deleteMany({
status: "abandoned",
updatedAt: { $lt: thirtyDaysAgo },
});
Дараагийн хичээлд:
Projection ашиглан query-ийн үр дүнд зөвхөн хэрэгтэй талбаруудаа сонгон авах талаар үзнэ.