python-pymongo:key<bson.ObjectId>上的InvalidDocument; [英] Python-Pymongo : InvalidDocument on key <bson.ObjectId>

查看:35
本文介绍了python-pymongo:key<bson.ObjectId>上的InvalidDocument;的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在尝试在字符串中构建查询,然后使用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)}

这篇关于python-pymongo:key&lt;bson.ObjectId&gt;上的InvalidDocument;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆