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