MongoDB: 处理自动增加模型标识符而不是您自己的模型标识符 ObjectID 芒果
由于管理解决方案,我们使用 userId 对于用户集合, postId 用于收集消息和 topicId 收集主题 '_id' 每个集合作为唯一标识符。
它在工作开始时导致几个问题。 - 我遇到的一个问题是相关的 upserts -
使用 Mongoose, 我们有一个限制的计划 userId 对于独特的意思 - 但是当您在用户模型上进行更新时,使用更新和插入 true ,
MongoDB, 看来只是看看 ObjectIds 收藏,看它是否存在 - 它不是检查模型是否存在相同的模型 userId - 因此,蒙特加插入而不是更新。
让我用一些数据来说明它:
假设用户的集合有一个文档:
然后我们跑:
有可能思考 MongoDB 会找到现有文件 userId:3 和 udpate 他,所以必须有一些我做错了什么,因为他给了我一个重复键的错误?
它在工作开始时导致几个问题。 - 我遇到的一个问题是相关的 upserts -
使用 Mongoose, 我们有一个限制的计划 userId 对于独特的意思 - 但是当您在用户模型上进行更新时,使用更新和插入 true ,
MongoDB, 看来只是看看 ObjectIds 收藏,看它是否存在 - 它不是检查模型是否存在相同的模型 userId - 因此,蒙特加插入而不是更新。
让我用一些数据来说明它:
假设用户的集合有一个文档:
{
_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 和 udpate 他,所以必须有一些我做错了什么,因为他给了我一个重复键的错误?
没有找到相关结果
已邀请:
3 个回复
莫问
赞同来自:
用单独使用
柜台集合
跟踪最后使用的数字序列。 场地
_id
包含序列的名称和字段
seq
- 序列的最后一个值。
插入B.
柜台集合
用户ID的初始值:
创建
功能 getNextSequence, 接受序列名称。 功能使用
方法 findAndModify// 原子增加值
seq
并返回这个新含义:
使用此功能
getNextSequence//
期间
insert//
.
因此,在同一计数器中,您可以根据需要维护这么多的序列。 解决问题 upsert 看看街区
乐观周期
在这个链接中
https://docs.mongodb.org/manua ... ield/
.
第二种方法是使用中间软件。 mongoose, 如
https://github.com/TheRoSS/mongodb-autoincrement
.
我希望它会有所帮助。
快网
赞同来自:
我为您制作了一个样本,它将创建和保存新用户,将更新它 /使用 upsert/ 并创建另一个 upsert. 尝试启动此代码:
八刀丁二
赞同来自:
厘米。:
https://docs.mongodb.org/manua ... rt-id
为什么不使用 user_name 对于用户作为唯一标识符?
由于字段自动增加,因为标识符是环境中使用的不良做法。 mongodb, 特别是如果你想使用分段
=> 所有插入件都将在最后一个片段上发生
= > 簇 mongodb 我们必须经常放松 / 重新分发数据。
/目前它不会发生在系统上,因为您仍在使用生成的字段 _id/
当然,您还可以在用户ID字段上创建一个唯一的索引。 :
https://docs.mongodb.org/manua ... nique