1

我正在开发一个 mongo 数据库,由于某种原因,该数据库将用户 ID 存储为ObjectId.

为了测试一些功能,我希望能够填充一个测试数据库 - 例如,如下:

import mongomock
from bson import ObjectId

client = mongomock.MongoClient("mongodb://localhost:27017/test-database")
database = client.get_default_database()
database.test_collection.insert({'_id': ObjectId('my_user_id'), 'value': 'my_value'})

但是,运行此返回

InvalidId:“my_user_id”不是有效的 ObjectId,它必须是 12 字节的输入或 24 字符的十六进制字符串

如何正确地将 ObjectId 对象插入到我的测试数据库中,以便我可以使用

database.test_collection.find_one({'user': ObjectId('my_user_id')})

(当我查询真实数据库时效果很好)?

4

2 回答 2

1

正如 InvalidId 消息所述,您需要使用 12 字节的“二进制”输入或 24 字符的十六进制字符串。

因此,如果您想使用“my_user_id”之类的东西,您将需要使用二进制或十六进制表示,另外,12 字节或 24 十六进制会丢失两个字符。

例如,如果您的用户 ID 是“my_user_id00”,那么您可以使用以下任何一种:

database.test_collection.find_one({'user': ObjectId(b'my_user_id00')})
database.test_collection.find_one({'user': ObjectId('6d795f757365725f69643030')})

您可以在mongoDB API 文档中找到更多信息。

于 2019-11-18T18:53:13.120 回答
0

默认情况下,在集合中插入文档时,如果没有在字段名中添加带有_id的字段名,那么MongoDB会自动添加一个Object id字段,如下图![在此处输入图片描述]

https://i.stack.imgur.com/w6VDQ.png

因此,在执行插入查询时,像这样使用 _id ...

database.test_collection.insert({'_id': 'my_user_id', 'value': 'my_value'})

如果要确保 MongoDB 在创建集合时不创建 _id 字段,并且希望将自己的 id 指定为集合的 _id,则需要在创建集合时显式定义它。

于 2019-11-18T18:59:42.623 回答