猫鼬:更新数组中文件不工作
问题描述:
我试图通过添加对象,如果它不存在,并替换数组中的对象否则更新文档中的数组。但是除了$ set参数之外没有任何东西($ push,$ addToSet)会执行任何操作,并且$ set按预期工作 - 覆盖整个数组。 我的猫鼬模式:猫鼬:更新数组中文件不工作
var cartSchema = mongoose.Schema({
mail: String,
items: Array
});
POST请求处理程序:
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":"[email protected]",
"item":{
"_id":"59da78db7e9e0433280578ec",
"manufacturer":"Schecter",
"referenceNo":"Daemon-412",
"type":"Gitare",
"image":"images/ba9727909d6c3c26412341907e7e12041507489988265.jpeg",
"__v":0,
"subcategories":[
"Elektricne"
]
}
}
编辑:
{ 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)
});
当我触发'addToCart的要求我也得到这个日志
答
如果现有文档具有完全相同的字段和值,且字段顺序相同,则$ addToSet中的比较将仅成功。否则,操作员将失败。
所以在你的情况下,request.item总是需要完全一样。
我建议创建一个“item”模型。然后,您的购物车模式将如下所示:
var cartSchema = mongoose.Schema({
mail: String,
items: [{
type: ObjectId,
ref: 'item',
}],
});
然后让MongoDB确定该项是否存在。
'item'的内容是什么? –
原始帖子底部的json对象 – bltzrrr
请参阅更新。 –