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

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

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

    最近在搞一个推荐的东西,但是那套推荐算法中要的数据是 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 就啥问题没有了
    oneisall8955
        9
    oneisall8955  
       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   ·   实用小工具   ·   3378 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 11:29 · PVG 19:29 · LAX 03:29 · JFK 06:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.