Mongoose:更新文档中的数组无法正常工作

我试图更新文件中的数组,如果它不存在,添加对象,否则replace数组中的对象。 但是除了$ set参数之外,没有任何东西($ push,$ addToSet)会执行任何操作,并且$ set按预期工作 – 覆盖整个数组。 我的mongoose模式:

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函数,testing如果项目是你正在寻找的一个:

 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总是需要完全一样的。

我会build议创build一个“项目”的模型。 那么,你的购物车模式将是:

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

让MongoDB确定项目是否存在。