我对MongoDB和Python都是新手,只是想玩一下。
在我的第一个实验中,我遇到了一些奇怪的事情。
我有一个这样的upsert调用:
def update_value(big_int_value: int, bool_value: bool):
db["my_db"].update_one({"level_1": {"field_1": big_int_value}},
{"$set": {"level_1.field_2": bool_value}},
upsert=True)
它第一次成功插入文档。但是我有很大的int值,所以它们在mongo中保存为Long('big_int_value')
:
{
_id: ObjectId("6515e4196b6f0a16194b0f58"),
level_1: { field_1: Long("1144745341514698845"), field_2: true }
}
因此,当我下次再次使用相同的big_int_value调用此update_one
代码时,它无法找到已经存在的文档,并创建一个新文档。
我试图在mongosh中找到现有的记录,只能通过以下查询找到它们:
db.my_col.find({"level_1.field_1": Long("1144745341514698845")})
如果没有显式的Long()
,则未找到结果。
我试着在pymongo中找到一些int的类型转换或 Package 到Mongo友好的long值的类似物,但没有找到。
当然,我还有一个替代方案,将值存储为字符串,而不是数字。但是我很好奇是否有一种原生的优雅的方式来使用python的int搜索mongo的“Long()”值。
任何信息是高度赞赏!
1条答案
按热度按时间huus2vyu1#
我已经找到了我在例子中看到的行为的原因。
问题出在过滤器查询中:
这部分是错误的:
在这里的文档中说:
要在作为嵌入/嵌套文档的字段上指定相等条件,请使用查询筛选器文档{ field:value },其中value是要匹配的文档。
因此,使用的过滤器表单试图在“level_1”字段中找到任何结果,该字段有一个嵌套的文档作为只有一个字段的值。但在我的结构中,嵌套的文档有tro字段。
使用正确的过滤器表单更改查询,即使没有任何数据转换,一切也开始正常工作: