我当前正在尝试在字符串中构建查询,然后使用eval
(ast_eval
)将其转换为dict
,以便将其转换为Pymongo更新。
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和hmmm之外,我没有任何"字段键",我认为我不应该将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)}