簡體   English   中英

貓鼬:更新文檔中的數組不起作用

[英]Mongoose: updating array in document not working

我試圖通過添加對象(如果不存在)來更新文檔中的數組,否則替換數組中的對象。 但是除了$ set參數之外,什么都沒有($ push,$ addToSet),並且$ set可以正常工作-覆蓋整個數組。 我的貓鼬模式:

var cartSchema = mongoose.Schema({
   mail: String,
   items: Array
});

帖子請求處理程序:

app.post('/addToCart', function(req, res) {
var request = req.body;
Cart.findOneAndUpdate({
        "mail": request.mail
    }, {
        $addToSet: {
            "items": request.item
        }
    }, {
        upsert: true
    },
    function(err, result) {
        console.log(result);
    }
);
    res.send(true);
});

我從客戶端發送的數據:

{  
"mail":"test@gmail.com",
"item":{  
      "_id":"59da78db7e9e0433280578ec",
      "manufacturer":"Schecter",
      "referenceNo":"Daemon-412",
      "type":"Gitare",
      "image":"images/ba9727909d6c3c26412341907e7e12041507489988265.jpeg",
      "__v":0,
      "subcategories":[  
          "Elektricne"
      ]
}
}

編輯:

當我觸發“ addToCart”請求時,我也會得到以下日志:

{ MongoError: The field 'items' must be an array but is of type object in 
document {_id: ObjectId('5a19ae2884d236048c8c91e2')}

這應該可以工作,您只需要實現objectExits函數即可測試項目是否為您要查找的項目:

Cart.findOne({ "mail": request.mail })
    .exec()
    .then(cart => {
        var replaced = cart.items.some((item, i) => {
            if (item._id == request.item._id)) {
                cart.items[i] = request.item;
                return true;
            }
        })
        if (!replaced) {
            cart.items.push(request.item);
        }
        cart.save();
        return cart;
    })
    .catch(err => {
        console.log(err)
    });

當現有文檔具有完全相同的字段和值且字段順序相同時,$ addToSet中的比較才會成功。 否則,操作員將失敗。

因此,在您的情況下,request.item始終需要完全相同。

我建議創建一個“項目”模型。 然后,您的購物車模式將類似於:

var cartSchema = mongoose.Schema({
   mail: String,
   items: [{
        type: ObjectId,
        ref: 'item',
    }],
});

然后讓MongoDB確定該項是否存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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