我對 nodejs 還很陌生,我正在做一個來自 devchallenges.io (Shoppingify) 的全堆疊開發者挑戰。下面,我試圖根據用戶是點擊增加還是減少商品數量來增加數量值。但是,請求的回傳值與資料庫中的實際值之間存在輕微延遲。看起來值會立即更新,這很好,但是請求中的回傳值是之前的值,而不是資料庫中的當前數量值。
mongoDB 資料庫


// @route PUT api/list/item/quantity/:id
// @desc update item quantity
// @access Private
router.put('/item/quantity/:id', auth, async (req, res) => {
const { action } = req.body;
try {
let list = await List.findOne({ user: req.user.id });
// find current quantity
const item = list.items.find((item) => {
return item._id.toString() === req.params.id;
});
// increase quantity
if (action === 'increase') {
list = await List.findOneAndUpdate(
{ 'items._id': req.params.id },
{ $set: { 'items.$.quantity': item.quantity 1 } },
{ new: true }
);
} else {
// decrease quantity
list = await List.findOneAndUpdate(
{ 'items._id': req.params.id },
{ $set: { 'items.$.quantity': item.quantity - 1 } },
{ new: true }
);
}
res.json(item.quantity);
} catch (error) {
console.error(error.message);
res.status(500).send('Server Error');
}
});
uj5u.com熱心網友回復:
你item在這里定義:
const item = list.items.find((item) => {
return item._id.toString() === req.params.id;
});
此時list是物件的“舊”版本,您希望在更新后在更新list物件時執行相同的操作,然后才回傳它。
// this is the original "list" item
let item = list.items.find((item) => {
return item._id.toString() === req.params.id;
});
...
update list
...
// now "list" is updated
item = list.items.find((item) => {
return item._id.toString() === req.params.id;
});
我將添加兩個額外的技巧來提高性能,它們是相互排斥的,因此您必須選擇兩者之一。
- 在更新查詢中添加
list._id它,如果我猜測該集合在該items欄位上沒有索引(如果有,通常是個壞主意)。這意味著當您僅使用該item._id欄位進行更新時,mongo 需要更長的時間才能找到該物件。這兩個更新都發生了快速變化:
list = await List.findOneAndUpdate(
{ _id: list._id, 'items._id': req.params.id },
{ $set: { 'items.$.quantity': item.quantity - 1 } },
{ new: true }
);
- (我的首選選項)在一次呼叫中完成,使用更新arrayFilters選項,如下所示:
const list = await List.findOneAndUpdate(
{
user: req.user.id,
},
{
$inc: {
'items.$[elem].quantity': action === 'increase' ? 1 : -1,
},
},
{
arrayFilters: [
{
'elem._id': new ObjectId(req.params.id),
},
],
new: true,
});
const item = list.items.find((item) => {
return item._id.toString() === req.params.id;
});
蒙戈游樂場
在我看來,現在你的路線看起來好多了,你也從 2 db 呼叫減少到 1。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/396462.html
上一篇:恢復MongoDB副本集成員
