2017-03-15 8 views
0

上InvalidDocument私は現在、更新をpymongoまで渡すためにdictにそれを変換するためにその使用evalast_eval)の後に、文字列でクエリを構築しようとしています。Pythonの-Pymongo:キー<bson.ObjectId>

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以外の文字列ではない "フィールドキー"を持っていないと私はハードコードされた文字列LOLでObjectIdを回す必要がないと思うhmmm。だから私は誰かが何が問題なのか説明できるかどうか疑問に思っていたのですか?

ありがとうございます!

答えて

2

それはちょうどする必要があります:あなたはMongoDBので混乱している

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

は次のようにあなたが評価できるJSONを、拡張:

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

しかし、あなたのクエリを構築するための最も簡単な方法は、Pythonでありますリテラル:

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

ah!そうです。私が間違っている箇所を明確かつ簡潔に説明していただきありがとうございます。また、最後のものを提案するために!私は "私がそれをする"ことを忘れてしまった!再度、感謝します! – Reiion