如何将字符串转换为 MongoDB objectId

Posted

技术标签:

【中文标题】如何将字符串转换为 MongoDB objectId【英文标题】:How to convert string to MongoDB objectId 【发布时间】:2022-01-02 19:34:40 【问题描述】:

我有一个类似this is my content 的内容,我想将它存储到 MongoDB 集合中。 问题是我想更新我的数据并且我想在集合中找到_id 的数据而不将查询发送到数据库。 我想出了根据我的文档内容生成我的_ids 的想法。 我尝试将内容转换为 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 类型。以下伪代码在_idString 的情况下可以正常工作:

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 必须是ObjectIdint 或类似的东西以防止查询缓慢。跨度> 这不是真的。你在哪里读到的? _id中任何类型的基本性能相同;密钥的长度可能会略有不同。 ObjectId 表示为 12 个字节的数据。长度为 12 字节左右的 string 将具有相同的性能。一个 64 字节的字符串可能会稍微少一些。 _id 自动携带唯一索引并在查找计划中使用特殊 IDHACK(如 explain() 所示)。 这可能有用:***.com/questions/28895067/…

以上是关于如何将字符串转换为 MongoDB objectId的主要内容,如果未能解决你的问题,请参考以下文章

如何在聚合期间将mongodb子集合的objectid转换为字符串

将字符串转换为 MongoDB BsonDocument

如何将 MongoDB 中的属性从文本类型转换为日期类型?

MongoDb:$elemMatch,将字符串转换为数字

如何使用 Python 将 MongoDB 的 bsondump 转换为 JSON?

MongoDB以科学计数法将数字转换为字符串