[英]mongoose update millions of records while extracting information
我們有一個包含超過 500 萬條客戶記錄的生產數據庫,每個客戶文檔都嵌入了他們申請的許可證數組。 示例客戶文檔如下:
{
_id: ObjectId('...'),
phoneNumber: 'xxxx',
// Other customer fields
licenses: [
{
_id: ObjectId('...'),
state: 'PENDING',
expired: false,
createdAt: ISODate(''),
// Other license fields
},
// More Licenses for this customer
]
}
我的任務是將9月份申請的每個PENDING許可證的狀態更改為REJECTED ,並向每個待處理許可證剛剛被拒絕的客戶發送短信。
使用model.where(condition).countDocuments()
我發現有超過 300 萬客戶(不是許可證)符合上述標准。 每個客戶平均擁有 9 個許可證。
我需要幫助提出一個在執行此操作時不會減慢系統速度的策略。 此外,這大約是17GB的數據。
發送短信很好,我可以為短信服務排隊詳細信息。 我的挑戰是在為 SMS 提取相關信息的同時處理許可證。
首先,您必須在集合上創建索引:
db.collection.createIndex( { "licenses.state": 1 } )
然后你應該做這樣的事情:
model.updateMany({}, {
'$set': {
'licenses.$[elem].state': 'REJECTED'
}
}, { arrayFilters: [{
'elem.createdAt': { $gte: ISODate(....) }
}],
multi: true
} ).then(function (doc)){}
如果您有一個副本集並且您的更新在主實例上,則在讀取次實例時不應影響輔助實例。
如果您想將更新拆分為多個批次,您可以使用 _id(已編入索引)。 當然,這取決於您的 _id 格式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.