MongoDB 中有没有什么办法能把 ObjectId 转为 Long? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ohyeahhh
V2EX    MongoDB

MongoDB 中有没有什么办法能把 ObjectId 转为 Long?

  •  
  •   ohyeahhh 2019-07-05 17:06:06 +08:00 12406 次点击
    这是一个创建于 2290 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在搞一个推荐的东西,但是那套推荐算法中要的数据是 userId,itemId,rating 这种,其中 userId 和 itemId 好像只能是 Long 型,但我们的库里存的都是 ObjectId,想问下有没有什么方法能转吗?

    13 条回复    2019-11-23 09:53:29 +08:00
    Aidenboss
        1
    Aidenboss  
       2019-07-05 17:14:17 +08:00
    Number.parseInt(objectId, 16)
    sujin190
        2
    sujin190  
       2019-07-05 17:28:24 +08:00
    都是二进制看你怎么解码了,按 ObjectId 解码就是 ObjectId 按 Long 解码就是 Long,但是你要怎么把 12 字节的 ObjectId 放到一个 8 字节的 Long 上去
    tikazyq
        3
    tikazyq  
       2019-07-05 17:28:54 +08:00
    getTimestamp
    ChristopherWu
        4
    ChristopherWu  
       2019-07-05 17:44:40 +08:00
    @tikazyq getTimestamp 是不对的。ObjectId 并不等价于其中的 Timestamp
    ohyeahhh
        5
    ohyeahhh  
    OP
       2019-07-05 18:16:44 +08:00
    @Aidenboss #1 如果我要再转回来呢?
    chendy
        6
    chendy  
       2019-07-05 18:22:05 +08:00
    ObjectId 12 个字节
    Long 8 个字节
    感觉很难转
    ohyeahhh
        7
    ohyeahhh  
    OP
       2019-07-05 18:56:10 +08:00
    @chendy #6 如果是 String 呢 因为 ObjectId 是可以转成 String 的
    chendy
        8
    chendy  
       2019-07-05 19:11:39 +08:00
    @ohyeahhh String 就啥问题没有了
    itechify
        9
    itechify  
    PRO
       2019-07-05 19:25:35 +08:00 via Android
    userId 这种字段可以用 ObjectId 类型,你要短一点好认作为对人类友好的表示,用一个唯一 orderNo 字段然后自己定义规则即可。
    另外,非要 long 类型作为 Id 字段的话,可以参考使用雪花算法,实现全数字,但是雪花算法算出来的 ID 跟 ObjectId 是不兼容的,也就是说,有一个雪花算法算出来的 long 型 id 为 xxx,那么 new ObjectId(xxx)是会被底层检查不符合 ObjectId 的规则导致抛出异常。
    雪花算法的 ID 也很长,要短一点的话,参考美团团队的做法,搜索一下看下怎么实现吧,但是这个我没应用过。
    个人愚见
    lihongjie0209
        10
    lihongjie0209  
       2019-07-05 19:36:31 +08:00
    不可能, 超过了 long 的长度了
    metrxqin
        11
    metrxqin  
       2019-07-05 21:04:46 +08:00 via Android
    ObjwctId 不可能用于存储业务参数。
    ericgui
        12
    ericgui  
       2019-07-06 11:55:53 +08:00
    为什么不能存成为 string
    q540374501
        13
    q540374501  
       2019-11-23 09:53:29 +08:00
    node 转成 long 还要引入 biginteger 包。。不然放不下,计算不了。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2474 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 01:38 PVG 09:38 LAX 18:38 JFK 21:38
    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