【发布时间】:2016-01-31 08:18:43
【问题描述】:
由于管理决策,我们将 userId 用于用户集合,postId 用于帖子集合,topicId 用于主题集合,而不是每个集合的“_id”作为唯一标识符。
这会导致一些问题开始 - 我遇到的问题之一是 upserts -
使用 Mongoose,我们有一个架构将 userId 限制为唯一值 - 但是在更新用户模型时,将 upsert 设置为 true,MongoDB 似乎只查看 ObjectId集合来查看是否存在相同的集合 - 它不检查是否已经存在具有相同 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 的现有文档并更新它,所以一定是我做错了什么,因为它给了我重复键错误?
【问题讨论】:
-
我觉得奇怪的是,在这种情况下,它试图插入一条新记录,而一条新记录显然已经存在并且应该与所使用的查询匹配。
-
是的,我也觉得很奇怪,我肯定做错了什么,但我不知道是什么
-
我知道当我第一次迁移到 mongodb 时考虑做同样的事情时遇到了同样的问题,但我认为我从来没有解决过它,我最终找到了我链接的文章,并认为这条路线不适合我们。
-
该变通方法有效,但想找出原始问题出现的原因