[英]Mongoose - How To Update Many Specific Records With One Value Per Reord?
如何在NodeJS-Express中使用mongoose更新多個記錄,每個記錄都具有唯一值(項目不是都具有相同的值)而不會導致N + 1問題? 我有以下場景:
產品介紹:
[
{
_id: "407f191e810c19729de860ea",
title: "....",
in_stock: 100,
},
{
_id: "507f1f77bcf86cd799439011",
title: "....",
in_stock: 100,
},
....
]
然后給出這樣的“訂單”請求:
[
{
item_id: "507f1f77bcf86cd799439011",
quantity: 5
},
{
item_id: "407f191e810c19729de860ea",
quantity: 8
},
...
]
換句話說,給定一個id,quantity元組的數組,我需要減少數據庫中每個相應記錄的庫存。 如何在不必為每個項目運行一個查詢的情況下完成此操作?
從上面的例子中,db的最終結果應該是:
[
{
_id: "407f191e810c19729de860ea",
title: "....",
in_stock: 92,
},
{
_id: "507f1f77bcf86cd799439011",
title: "....",
in_stock: 95,
},
....
]
好吧,在這種情況下,你可以使用這樣的代碼。 但我非常懷疑這是你想要實現的目標。
我在我的項目中也嘗試過同樣的問題,但遇到的唯一方法是迭代id並僅運行不同的查詢。
db.Element.update(
{ _id: { $in: ['id1', 'id2', 'id3'] } },
{ $set: { visibility : yourvisibility } }
)
像這樣的代碼應該可以解決問題
updateById(0); //call updates iteration
function updateById(i) {
if (i < order.length) {
Products.findByIdAndUpdate({ _id: order[i]._id }, { in_stock: order[i].in_stock }, (err, data) => {
if (!err) { updateById(i++); }
else{throw err}
});
}
else {
// return
}
}
您將需要使用ID迭代庫存中的訂單數組查找項目,然后您可以更新庫存計數,例如,
order.forEach((item) => {
Products.findByIdandUpdate(item._id,
{$set: {in_stock: (in_stock - item.quantity)}}, {new:true})
.then((updatedItem) => {
if(!updatedItem) {
console.log('Cannot update!');
}
else {
console.log(updatedItem);
}
});
});
對於那些遇到這個問題的人,我還沒有找到非N + 1解決方案。 為了擴展上面的答案,我找到的最佳解決方案是使用異步模塊,至少避免可能阻塞代碼:
itemModel.find({ // find items from ids
'_id': itemIds
}).then(function (items) {
if (items) {
asyncModule.each(items,
function (item, callback) {
item.in_stock -= orderQuantities[item._id];
item.save();
callback(); // tell async that current object is done processing
}, onCompleteFunc);
}
}).catch(handleError);
如果有人對此解決方案有任何意見或改進建議,歡迎提出反饋意見。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.