使用 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 中用户的唯一标识符的替代方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

将 ObjectID 作为字符串导入

使用自定义用户 ID 与 Mongodb ObjectId

mongo 模式(嵌入与参考)[重复]

BSON::ObjectId 与 Mongo::ObjectID

BSON::ObjectId 与 Mongo::ObjectID

如何检查 mongo ObjectID 在 python 中是不是有效?