我希望能夠更新一個物件陣列,其中每個物件都分配了一個新的唯一值。
這是我正在做的事情的一個簡化示例。items是我的收藏品陣列。
let items = [{_id: '903040349304', number: 55}, {_id: '12341244', number: 1166}, {_id: '667554', number: 51115}]
我想為每個專案分配一個新編號,然后在集合中更新它:
items = items.map(item => {
item.number = randomInt(0, 1000000);
return item;
})
一次更新集合的最佳方法是什么?我知道我可以在forEach而不是 中進行map,但這似乎是一種骯臟的方式,因為它不會進行批量更新。
items.forEach(async (item) => {
await this.itemModel.update({_id: item._id}, {number: randomInt(0, 1000000)})
});
我也檢查過updateMany,但我對它的理解是它只用于更新具有相同新值的檔案 - 不像在我的情況下,每個檔案都有一個新的唯一值分配給它。
uj5u.com熱心網友回復:
經過一番思考,我想出了這個使用bulkWrite.
const updateQueries = [];
items.forEach(async (item) => {
updateQueries.push({
updateOne: {
filter: { _id: item._id },
update: { number: item.number },
},
});
});
await this.itemModel.bulkWrite(updateQueries);
關于 bulkWrite
在一個命令中向 MongoDB 服務器發送多個 insertOne、updateOne、updateMany、replaceOne、deleteOne 和/或 deleteMany 操作。這比發送多個獨立操作(如使用 create())要快,因為使用 bulkWrite() 只需要一次往返 MongoDB。
uj5u.com熱心網友回復:
您可以呼叫aggregate() 來立即更新它們,而無需先拉它們:
步驟 1:使用 mongoDb 內置$rand選項獲取亂數,該選項回傳 0 到 1 之間的數字步驟2:$multiply此數字乘以 1000000,因為這是您定義的;)步驟 3:使用另一個$setwith$floor洗掉小數部分
YourModel.aggregate([
{
'$set': {
'value': {
'$multiply': [
{
'$rand': {}
}, 1000000
]
}
}
}, {
'$set': {
'value': {
'$floor': '$value'
}
}
}
])
這是一張在 mongo Compass 中看起來如何的圖片,作為它作業的證明:

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/377449.html
