V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐工具
RoboMongo
推荐书目
50 Tips and Tricks for MongoDB Developers
Related Blogs
Snail in a Turtleneck
hilenlai
V2EX  ›  MongoDB

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

  •  
  •   hilenlai · 2013-04-26 13:07:16 +08:00 · 7494 次点击
    这是一个创建于 4230 天前的主题,其中的信息可能已经有所发展或是发生改变。
    mongodb如何来做出给每个collection做一个id的问题?
    比如 用户的collection会有个uid来作为标志位
    比如 商品的collection会有个pid来作为标志位

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

    不知道这种做法是否得体?
    请各位大神给个解决方案吧
    14 条回复    1970-01-01 08:00:00 +08:00
    binux
        1
    binux  
       2013-04-26 13:16:24 +08:00   ❤️ 1
    操作不是原子的,可能会冲突
    直接用_id不就好了
    hilenlai
        2
    hilenlai  
    OP
       2013-04-26 13:28:41 +08:00
    @binux 以前用mysql,有点受它的自增id问题影响。如果要把_id存到session里面会不会太长? 而且get方法传参的时候也会特长啊
    ljbha007
        3
    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
        4
    ljbha007  
       2013-04-26 14:42:24 +08:00
    @hilenlai
    你这个办法也可以 但是就是必须得给你的id加上unique限制
    然后插入的时候得在死循环插入,如果插入失败则表示出现了竞态问题,id重复了,这时候重新再做一遍就好了
    这个办法就是效率低 会增加很多查询压力和代码运行次数
    说到底还不如重新设计字段改用ObjectID
    除非是要统计点击次数什么的使用自增还可以接受
    hussion
        5
    hussion  
       2013-04-26 15:59:25 +08:00
    uid是根据机器码,时间戳等四项参数来计算的。。。
    humiaozuzu
        6
    humiaozuzu  
       2013-04-26 16:04:28 +08:00
    使用加密后的id如何?
    http://v2ex.com/t/65414
    hilenlai
        7
    hilenlai  
    OP
       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
        8
    hilenlai  
    OP
       2013-04-26 16:18:56 +08:00
    @humiaozuzu 也是有点长,现在的解决方法是利用postgreSQL里面的序列(postgre sequence),来产生那个id。然后获取之后就插入mongodb,不知道这种做法会怎样~
    ljbha007
        9
    ljbha007  
       2013-04-26 16:29:11 +08:00
    @hilenlai
    mongodb不带自增属性。。。
    我前面意思也是不建议你用自增ID。。。
    hilenlai
        10
    hilenlai  
    OP
       2013-04-26 16:56:31 +08:00
    @ljbha007 嗯~多谢指导
    wy315700
        11
    wy315700  
       2013-04-26 17:16:08 +08:00
    自增ID是sql时代的产物 不适合NOSQL
    NOSQL应该使用UUID 方便分布式存取

    直接留空_id 或者 用UUID生成器
    hilenlai
        12
    hilenlai  
    OP
       2013-04-26 17:21:20 +08:00
    @wy315700 能具体说下 “直接留空_id 或者 用UUID生成器” 的意思吗
    wy315700
        13
    wy315700  
       2013-04-26 21:52:07 +08:00   ❤️ 2
    @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
        14
    hilenlai  
    OP
       2013-04-27 00:11:08 +08:00
    @wy315700 多谢!科普了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2887 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 09:03 · PVG 17:03 · LAX 01:03 · JFK 04:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.