簡體   English   中英

貓鼬在提取信息的同時更新數百萬條記錄

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM