由于管理决策,我们现在将userId用于用户集合,postId用于帖子集合,topicId用于主题集合,而不是使用'_id'作为每个集合的唯一标识符。这会导致一些刚开始时的问题-我遇到的一个问题是upserts——使用Mongoose,我们有一个模式,限制了userId必须是唯一的值-但是当对一个用户模型进行更新,并将upsert设置为true时,MongoDB似乎只查看集合的ObjectIds来查看是否存在相同的对象,而不是检查是否已经存在具有相同userId的模型-因此Mongo会执行插入操作而不是更新操作。
让我用一些数据说明一下:
假设用户集合只有一个文档:
我们接下来运行:
让我用一些数据说明一下:
假设用户集合只有一个文档:
{
_id:'561b0fad638e99481ab6d84a'
userId:3,
name:'foo'
}
我们接下来运行:
User.update({userId:3},{"$set":{name:'bar'},{upsert:true},function(err,resp){
if(err){
// "errMessage": "insertDocument :: caused by :: 11000 E11000 duplicate key error index: app42153482.users.$userId_1 dup key: { : 3 }",
}
});
有人可能会认为MongoDB会找到userId为3的现有文档并更新它,所以既然出现了重复键错误,我肯定做错了什么?