使用 ObjectId 作为 mongo 中用户的唯一标识符的替代方法是啥?
Posted
技术标签:
【中文标题】使用 ObjectId 作为 mongo 中用户的唯一标识符的替代方法是啥?【英文标题】:What's an alternative to using ObjectId as a unique identifier for a user in mongo?使用 ObjectId 作为 mongo 中用户的唯一标识符的替代方法是什么? 【发布时间】:2013-02-10 18:39:03 【问题描述】:我的网站布局是这样的:
blah.com/user/<username>
User1
_id: "ObjectID(asdfa)",
name: "john smith",
email: "blah@test.com,
friends: [
"ObjectID(asdfa2)",
"ObjectID(asdfa3)",
"ObjectID(asdfa4)",
]
我宁愿不使用用户名作为我集合中的唯一键,所以我想使用 ID。但我认为到处都有 ObjectID 引用并不好。如何制作一个有组织的集合,其中 _id 既独特又可读,没有自动递增?
【问题讨论】:
为什么你认为它不好? ObjectID 没有任何问题。 相关:***.com/a/14277486/125816 我在一个问题中看到了。 ***.com/questions/11697631/… 唯一、高效、可读的 ID 在 MongoDB 中是一个很高的要求,尤其是因为它没有自动增量列。如果您的usernames
是独一无二的,并且永远不会改变,那似乎是一个合理的选择。
我会说用户名不是一个好的选择,就像分片上的 objectid 一样,字母表是一个单调的数字 (a-z),就像 objectid 的时间戳一样,这可能会使某些情况变得糟糕情况。因此,您可能会看到所有新写入在集群内变得不平衡并发送到单个分片。这并不总是一件坏事,但你需要牢记这一点。另一种选择是更加“随机”的 GUID。你可以散列你的分片键来创造平衡。
【参考方案1】:
一般来说,文献推荐尝试自然键,但正如我所见,您的收藏没有任何有意义的价值,除了电子邮件,但通常是敏感数据。
您可以根据您定义的任何业务规则在应用层生成密钥,避免自动递增密钥,并为系统 URL 中使用的密钥添加一些含义。
问候, 莫西
【讨论】:
以上是关于使用 ObjectId 作为 mongo 中用户的唯一标识符的替代方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
BSON::ObjectId 与 Mongo::ObjectID