python-pymongo:key<bson.ObjectId>上的InvalidDocument;

2022-03-14 00:00:00 python mongodb pymongo

问题描述

我目前正在尝试在字符串中构建查询,然后使用eval(ast_eval)将其转换为dict,以便向上传递到pymongo update。

for item in default_properties:
    query = '{"_id": {ObjectId:"%s"}}' % (oid)
if (doc["diff_id"] == diff_id):
                default_val_pos = [line[0], line[1],line[2],line[3],line[4],line[5],line[6],line[7],line[8]]
                update_val = '{ "$set":{"properties.%s": default_val_pos[%d] } }' % (item,idx)
                db.routes.update(eval(query), eval(update_val))

我想现在应该可以了,因为在mongoshell中本身接受相同的查询,唯一的区别是我使用了from bson.objectid import ObjectId来很好地格式化它,但是,出现了这个错误:

InvalidDocument: documents must have only string keys, key was <class 'bson.objectid.ObjectId'>

据我所见,除了ObjectID之外,我没有任何不是字符串的"字段键",我认为我不应该将ObjectID转换为硬编码字符串LOL中的ObjectID。所以我想知道有没有人能解释一下有什么问题?

谢谢!


解决方案

应该是:

query = '{"_id": ObjectId("%s")}' % (oid)

您与MongoDB扩展JSON混淆了,您可以这样评估它:

query = '{"_id": {"$oid": "%s"}}' % (oid)
from bson import json_util
query_dict = json_util.loads(query)

但构建查询的最简单方法是使用Python文字:

query_dict = {"_id": ObjectId(oid)}

相关文章