簡體   English   中英

Mongoose - 如何根據每個Reord更新許多特定記錄?

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

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