我是 MongoDB 的新手,我需要你的幫助。我想根據特定條件從集合中洗掉多個檔案,即基于 empID 分組并洗掉除該 empID 的最新記錄之外的記錄。
假設我的資料集如下所示:
[
{
_id: 1,
employeeId: "50052196",
name: "abc",
lastUpdatedOn: ISODate("2022-01-10T10:25:38.859 00:00")
},
{
_id: 2,
employeeId: "50052197",
name: "xyz",
lastUpdatedOn: ISODate("2022-01-17T10:25:38.859 00:00")
},
{
_id: 3,
employeeId: "50052198",
name: "pqr",
lastUpdatedOn: ISODate("2022-01-17T10:25:38.859 00:00")
},
{
_id: 4,
employeeId: "50052196",
name: "abc",
lastUpdatedOn: ISODate("2022-01-12T11:30:58.435 00:00")
},
{
_id: 5,
employeeId: "50052196",
name: "abc",
lastUpdatedOn: ISODate("2022-01-15T15:45:00.159 00:00")
}
]
在上面的資料集中,employeeID : 50052196是與 field 一起定期插入的重復檔案lastUpdatedOn。就像lastUpdatedOn記錄/檔案創建日期一樣。
現在,我想保留具有最新 lastUpdatedOn 值的檔案,即lastUpdatedOn:2022-01-15T15:45:00.159 00:00.employeeID : 50052196
我瀏覽了 MongoDB 檔案,發現我們無法撰寫洗掉查詢以及分組依據和排序操作,或者如果我們選擇聚合管道,那么我們無法洗掉聚合內的檔案。我正在檢查 的選項Bulk.find.remove(),但我再次無法弄清楚如何對employeeId 進行分組。
我想到的另一種方法,根據某些條件,我將添加一個欄位,即isActive: true. 并且使用正常deleteMany()操作我可以洗掉isActive: false檔案。但根據政策,我不能修改檔案。集合中的插入操作由第三方應用程式處理,我們無法修改。
由于檔案的數量更大,我想撰寫一個代碼,它會減少時間和資源消耗,同時它應該遵循最佳實踐。非常感謝您的幫助。誰能建議我解決這種情況的好選擇。非常感謝您的幫助。
注意:我必須為多個 MongoDB 集合撰寫相同型別的洗掉代碼。這是我正在考慮撰寫的一種清理腳本。
uj5u.com熱心網友回復:
您可以使用任何您想要的管道并在最后添加一個$out階段,這將覆寫所選的集合。
例如:
db.collection.aggregate([
{
$sort: {
lastUpdatedOn: -1
}
},
{
$group: {
_id: "$employeeId",
root: {
$first: "$$ROOT"
}
}
},
{
$replaceRoot: {
newRoot: "$root"
}
},
{
$out: "collection"
}
])
蒙戈游樂場
代碼中更受控制的方式,逐個用戶迭代:
const userIds = await db.collection.distinct('employeeId');
for (let i = 0; i < userIds.length; i ) {
const userId = userIds[i];
const employeeRecords = await db.collection.find({ 'employeeId': userId }).sort({ lastUpdatedOn: -1 }).toArray();
employeeRecords.pop();
await db.collection.deleteMany({ _id: { $in: employeeRecords.map(v => v._id) } });
}
(這應該并行運行。為了清楚起見,它寫在一個 for 回圈中)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/414177.html
標籤:
