如何将字符串转换为 MongoDB objectId
Posted
技术标签:
【中文标题】如何将字符串转换为 MongoDB objectId【英文标题】:How to convert string to MongoDB objectId 【发布时间】:2022-01-02 19:34:40 【问题描述】:我有一个类似this is my content
的内容,我想将它存储到 MongoDB 集合中。
问题是我想更新我的数据并且我想在集合中找到_id
的数据而不将查询发送到数据库。
我想出了根据我的文档内容生成我的_id
s 的想法。
我尝试将内容转换为 sha256 或 ... 然后在 python 中使用bson.ObjectId
生成我的_id
所以任何时候我想更新我的集合中的timestamp
我只需生成@987654327 @ 并向数据库集合发送更新查询。
但我遇到以下错误:
bson.errors.InvalidId: '3e2550e3ffd205d10900d893dd8d91be9f446d60' is not a valid ObjectId, it must be a 12-byte input or a 24-character hex string
我想知道这个想法是错误的还是...... 你能指导我吗?
【问题讨论】:
【参考方案1】:你的想法很好;诀窍是您不必为_id
字段使用ObjectId
类型。以下伪代码在_id
是String
的情况下可以正常工作:
String sid = hex(sha256("this"+"is"+"my"+"content"));
Document doc = _id:sid, theTimestamp:ISODate(), ...
db.collection.insert(doc);
...
db.collection.update(_id:sid, $set: theTimestamp:ISODate());
【讨论】:
问题是我不想将_id
存储为字符串。我测试了你的建议。但是pymongo 将_id
存储为字符串
我不明白。您希望能够根据数据本身构建_id
。您稍后希望能够快速组装这些部分并直接快速查找(或更新)_id
。这意味着_id
必须是string
。当您不想自己构建 _id
时,ObjectId
可用作“几乎唯一”的 ID。
如您所知,使用字符串作为_id
会导致查询速度变慢。所以_id
必须是ObjectId
或int
或类似的东西以防止查询缓慢。跨度>
这不是真的。你在哪里读到的? _id
中任何类型的基本性能相同;密钥的长度可能会略有不同。 ObjectId
表示为 12 个字节的数据。长度为 12 字节左右的 string
将具有相同的性能。一个 64 字节的字符串可能会稍微少一些。 _id
自动携带唯一索引并在查找计划中使用特殊 IDHACK(如 explain() 所示)。
这可能有用:***.com/questions/28895067/…以上是关于如何将字符串转换为 MongoDB objectId的主要内容,如果未能解决你的问题,请参考以下文章
如何在聚合期间将mongodb子集合的objectid转换为字符串