mongodb如何产生uid,pid并且无重复呢?

2013-04-26 13:07:16 +08:00
 hilenlai
mongodb如何来做出给每个collection做一个id的问题?
比如 用户的collection会有个uid来作为标志位
比如 商品的collection会有个pid来作为标志位

现在的解决方法是python每次去查collection最后一条数据,然后得到pid或者uid,然后在此基础上+1 作为当前用户的uid

不知道这种做法是否得体?
请各位大神给个解决方案吧
7407 次点击
所在节点    MongoDB
14 条回复
binux
2013-04-26 13:16:24 +08:00
操作不是原子的,可能会冲突
直接用_id不就好了
hilenlai
2013-04-26 13:28:41 +08:00
@binux 以前用mysql,有点受它的自增id问题影响。如果要把_id存到session里面会不会太长? 而且get方法传参的时候也会特长啊
ljbha007
2013-04-26 14:30:22 +08:00
@hilenlai
id长不长完全没影响 你这里完全用不着数字ID

如果非要用数字ID也完全可以做到
参见官方文档
http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/
ljbha007
2013-04-26 14:42:24 +08:00
@hilenlai
你这个办法也可以 但是就是必须得给你的id加上unique限制
然后插入的时候得在死循环插入,如果插入失败则表示出现了竞态问题,id重复了,这时候重新再做一遍就好了
这个办法就是效率低 会增加很多查询压力和代码运行次数
说到底还不如重新设计字段改用ObjectID
除非是要统计点击次数什么的使用自增还可以接受
hussion
2013-04-26 15:59:25 +08:00
uid是根据机器码,时间戳等四项参数来计算的。。。
humiaozuzu
2013-04-26 16:04:28 +08:00
使用加密后的id如何?
http://v2ex.com/t/65414
hilenlai
2013-04-26 16:17:38 +08:00
@ljbha007 考虑使用过mongodb的自增属性,但是stackover上一些人建议不使用这个(http://stackoverflow.com/questions/6645277/should-i-implement-auto-incrementing-in-mongodb)

@hussion 那pid 等等其他的id呢?没有那么多可以生成的啊
hilenlai
2013-04-26 16:18:56 +08:00
@humiaozuzu 也是有点长,现在的解决方法是利用postgreSQL里面的序列(postgre sequence),来产生那个id。然后获取之后就插入mongodb,不知道这种做法会怎样~
ljbha007
2013-04-26 16:29:11 +08:00
@hilenlai
mongodb不带自增属性。。。
我前面意思也是不建议你用自增ID。。。
hilenlai
2013-04-26 16:56:31 +08:00
@ljbha007 嗯~多谢指导
wy315700
2013-04-26 17:16:08 +08:00
自增ID是sql时代的产物 不适合NOSQL
NOSQL应该使用UUID 方便分布式存取

直接留空_id 或者 用UUID生成器
hilenlai
2013-04-26 17:21:20 +08:00
@wy315700 能具体说下 “直接留空_id 或者 用UUID生成器” 的意思吗
wy315700
2013-04-26 21:52:07 +08:00
@hilenlai http://docs.mongodb.org/manual/reference/object-id/ 插入不含_id字段的记录时
mongodb 会根据 时间戳 机器ID PID 计数器 为这条记录生成一个12字节的ID, 当然也可以在客户端生成
http://api.mongodb.org/python/1.7/api/pymongo/objectid.html

如果你嫌objectid太少,可以用uuid,
http://docs.python.org/2/library/uuid.html

用这个来取代自增ID还是有很多好处的,比如说可以防止别人猜测ID.
hilenlai
2013-04-27 00:11:08 +08:00
@wy315700 多谢!科普了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/67040

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX