mongodb PyMongo:如何通过int值搜索Long值

q3qa4bjr  于 2023-10-16  发布在  Go
关注(0)|答案(1)|浏览(105)

我对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()”值。
任何信息是高度赞赏!

huus2vyu

huus2vyu1#

我已经找到了我在例子中看到的行为的原因。
问题出在过滤器查询中:

db["my_db"].update_one({"level_1": {"field_1": big_int_value}},
                    {"$set": {"level_1.field_2": bool_value}}, 
                    upsert=True)

这部分是错误的:

{"level_1": {"field_1": big_int_value}}

在这里的文档中说:
要在作为嵌入/嵌套文档的字段上指定相等条件,请使用查询筛选器文档{ field:value },其中value是要匹配的文档。
因此,使用的过滤器表单试图在“level_1”字段中找到任何结果,该字段有一个嵌套的文档作为只有一个字段的值。但在我的结构中,嵌套的文档有tro字段。
使用正确的过滤器表单更改查询,即使没有任何数据转换,一切也开始正常工作:

db["my_db"].update_one({"level_1.field_1": big_int_value},
                        {"$set": {"level_1.field_2": bool_value}}, 
                        upsert=True)

相关问题