将MongoDB中的_id类型更改为整数是不是很糟糕?

jus*_* so 24 ruby-on-rails mongodb mongoid

MongoDB对_id使用ObjectId类型.

如果我使_id为递增整数会不会很糟糕?

(有了这个宝石,如果你有兴趣)

Sam*_*aye 25

不,它一点也不坏,事实上内置在ObjectId索引中是相当大的,所以如果你相信你有更好的东西,那么你非常欢迎你将_id字段的默认值更改为任何东西.

但是,这是一个很大但是,在决定放弃默认配置时有一些考虑因素ObjectId,特别是当使用如下所示的自动递增_ids时:http://docs.mongodb.org/manual/tutorial/create- AN-自动递增场/#自动递增的计数器收集

多线程并不是一个大问题,因为findAndModify原子锁实际上可以解决这个问题,但是你只是遇到了第一个问题.findAndModify不是最快的功能,也不是最轻的功能,并且在定期使用时会发现显着的性能下降.

你也必须考虑自己这样做的开销,即使没有findAndModify.对于您拥有的每个插入,您将需要进行额外的查询.具有唯一ID的图像,您必须查询每次要插入的唯一性,最终您的插入速率将下降到爬行状态,并且您的锁定将会累积.

当然,ObjectId通过在插入之前触摸数据库而不必检查或制定其自身的唯一性,它非常擅长独特,因此它没有这种开销.

这就是说它不是世界上最糟糕的想法,如果你认为它适合你的场景然后去做,但要记住,如果你不需要自动递增id,它可能是你的负担.


Phi*_*ipp 9

您可以这样做,但您有责任确保整数是唯一的.

MongoDB不支持像大多数SQL数据库一样的自动增量字段.如果您的分布式或多线程应用程序具有多个创建新数据库条目的进程和/或线程,则必须确保它们使用相同的计数器.否则,可能会发生两个线程试图在数据库中存储具有相同_id的文档.

当发生这种情况时,其中一个会失败.这意味着您必须等待数据库返回成功或错误(通过调用GetLastError或通过将写入关注设置为已确认),这比仅以发射后的方式发送数据需要更长的时间.