Python-Pymongo:键<bson.objectid>上的InvalidDocument

时间:2017-03-15 11:29:17

标签: python mongodb pymongo

我目前正在尝试在字符串中构建查询,然后使用evalast_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以外的字符串而且我不认为我应该在硬编码字符串中转换ObjectId lol。所以我想知道是否有人可以解释这是什么问题?

谢谢!

1 个答案:

答案 0 :(得分:2)

应该是:

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

您对MongoDB Extended JSON感到困惑,您可以评估如下:

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

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

query_dict = {"_id": ObjectId(oid)}
相关问题