mongodb如何产生uid,pid并且无重复呢? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hilenlai
V2EX    MongoDB

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

  •  
  •   hilenlai 2013-04-26 13:07:16 +08:00 7773 次点击
    这是一个创建于 4552 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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     Solana     831 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 21:05 PVG 05:05 LAX 14:05 JFK 17:05
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86