在 MongoDB 上,出于某种原因,_Id 字段总是非常相似,如此相似,以至于在 20 个文档之后我无法插入更多文档,因为 _Id 是相同的。我认为正在发生的事情是 MongoDB 根据文档内部的内容生成 _Id,并且我插入的所有文档都非常相似(但不相同)。我想做的就是生成一个随机 _Id 来解决这个问题。
我首先尝试的是从列表中随机挑选垃圾和数字 24 次(因为 _Id 字段有 24 个字符长),这就是我的做法:
alphabet = string.ascii_letters + string.digits
key = ''.join(secrets.choice(alphabet) for i in range(24))
但这给了我一个
TypeError: unhashable type: 'slice'
还有其他方法生成随机_Id吗?
secrets.choice() 函数用于从序列(如列表或字符串)中选择单个随机元素,但您尝试将其应用于切片(序列的一部分)。要使用字母表中的字符生成特定长度的随机字符串,您可以像这样修改代码:
import string
import secrets
alphabet = string.ascii_letters + string.digits
key = ''.join(secrets.choice(alphabet) for _ in range(24))
print(key)
这里,for _ in range(24)
迭代24次,并且在每次迭代中,从字母表中选择一个随机字符并将其添加到密钥字符串中。
_id
字段对于当前数据库是唯一的。出于所有合理的目的,您可以扩展该语句以表示生成的
_id
是全局唯一的。如果你快速连续地创建它们,它们看起来会很相似;那是因为它们是由随机机器标识符组成的,添加当前日期。至关重要的是,总有一个递增的 3 字节计数器。因此,除非您每秒添加超过 1600 万条记录,否则不会遇到任何重复记录。