猫鼬:更新数组中文件不工作

问题描述:

我试图通过添加对象,如果它不存在,并替换数组中的对象否则更新文档中的数组。但是除了$ 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')} 
+0

'item'的内容是什么? –

+0

原始帖子底部的json对象 – bltzrrr

+0

请参阅更新。 –

这应该工作,你只需要实现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确定该项是否存在。