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

2019 年 7 月 5 日
 ohyeahhh

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

12936 次点击
所在节点    MongoDB
13 条回复
Aidenboss
2019 年 7 月 5 日
Number.parseInt(objectId, 16)
sujin190
2019 年 7 月 5 日
都是二进制看你怎么解码了,按 ObjectId 解码就是 ObjectId 按 Long 解码就是 Long,但是你要怎么把 12 字节的 ObjectId 放到一个 8 字节的 Long 上去
tikazyq
2019 年 7 月 5 日
getTimestamp
huoru
2019 年 7 月 5 日
@tikazyq getTimestamp 是不对的。ObjectId 并不等价于其中的 Timestamp
ohyeahhh
2019 年 7 月 5 日
@Aidenboss #1 如果我要再转回来呢?
chendy
2019 年 7 月 5 日
ObjectId 12 个字节
Long 8 个字节
感觉很难转
ohyeahhh
2019 年 7 月 5 日
@chendy #6 如果是 String 呢 因为 ObjectId 是可以转成 String 的
chendy
2019 年 7 月 5 日
@ohyeahhh String 就啥问题没有了
itechify
2019 年 7 月 5 日
userId 这种字段可以用 ObjectId 类型,你要短一点好认作为对人类友好的表示,用一个唯一 orderNo 字段然后自己定义规则即可。
另外,非要 long 类型作为 Id 字段的话,可以参考使用雪花算法,实现全数字,但是雪花算法算出来的 ID 跟 ObjectId 是不兼容的,也就是说,有一个雪花算法算出来的 long 型 id 为 xxx,那么 new ObjectId(xxx)是会被底层检查不符合 ObjectId 的规则导致抛出异常。
雪花算法的 ID 也很长,要短一点的话,参考美团团队的做法,搜索一下看下怎么实现吧,但是这个我没应用过。
个人愚见
lihongjie0209
2019 年 7 月 5 日
不可能, 超过了 long 的长度了
metrxqin
2019 年 7 月 5 日
ObjwctId 不可能用于存储业务参数。
ericgui
2019 年 7 月 6 日
为什么不能存成为 string
q540374501
2019 年 11 月 23 日
node 转成 long 还要引入 biginteger 包。。不然放不下,计算不了。

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

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

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

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

© 2021 V2EX