2012-09-10 9 views
16

MongoDBとFlask(pymongoドライバを使用)を使用してWebサービスを作成しようとしています。データベースへのクエリは、もちろん「_id」フィールドが含まれるドキュメントを返します。これをクライアントに送信したくないので、どうすれば削除できますか?ここでPymongoの結果から_id要素を削除する

は、フラスコのルートです:

@app.route('/theobjects') 
def index(): 
    objects = db.collection.find() 
    return str(json.dumps({'results': list(objects)}, 
     default = json_util.default, 
     indent = 4)) 

これが返されます。

{ 
"results": [ 
    { 
     "whatever": { 
      "field1": "value", 
      "field2": "value", 
     }, 
     "whatever2": { 
      "field3": "value" 
     }, 
     ... 
     "_id": { 
      "$oid": "..." 
     }, 

    ... 
    } 
]} 

を私はそれが辞書だったと私はちょうどそれを返す前に要素を削除できると思っていた:

del objects['_id'] 

しかし、これはTypeErrorを返します:

TypeError: 'Cursor' object does not support item deletion 

これは辞書ではありませんが、各結果を辞書として反復処理する必要があります。だから私はこのコードでそれをやろう:

for object in objects: 
    del object['_id'] 

各オブジェクト辞書は道に見える私は今それをしたいと思いますが、オブジェクトのカーソルは空です。だから私は、新しい辞書を作成しようと、それぞれから_idを削除した後、フラスコを返します。新しい辞書に追加します。

new_object = {} 
for object in objects: 
    for key, item in objects.items(): 
     if key == '_id': 
      del object['_id'] 
      new_object.update(object) 

これは単に最初のレベルのキーと他には何もして辞書を返します。

これは標準的なネストされた辞書の問題のようなものですが、MongoDBにはこれに簡単に対処する方法がないことにもショックを受けます。

MongoDB documentationあなたは

{ _id : 0 } 

に_idを除外することができますしかし、それはpymongoと何もしないことを説明しています。 Pymongo documentationは、返信するフィールドを一覧表示することができますが、 "(" _id "は常に含まれる)ことを説明しています。"真剣に?これを回避する方法はありませんか?私はここで見落としている単純で愚かなものがありますか?

+0

あなたの実際の主張は何ですか?新しい辞書を作成するためのあなたのコードは奇妙で、必要ではありません。あなたの本当の問題は何ですか? –

+0

私の問題は、.find({}、{'_id':False})は_idを除外していないということでした。しかし、それは私のコードに問題があり、現在は動作しています。ご協力いただきありがとうございます。 – ddw

+0

"オブジェクトのカーソルは空です":これは1回だけ反復できるので、反復し、次のdictを取得し、 '_id'を削除し、dictをリストに入れ、最後にリストを返す必要があるからですオブジェクト。 –

答えて

53

pymongoでの検索クエリで_idフィールドを除外するには、あなたが使用することができます。

db.collection.find({}, {'_id': False}) 

ドキュメントが多少ありますこれには、_idというフィールドが常に含まれていると言われています。しかし、あなたは上記のようにそれを除外することができます。

+0

ありがとう、これは正しいです。私はこれを投稿する前に試してみましたが、最初のパラメータで渡していた文字列に問題があったと思います。私はそれを修正し、今はすべてが良いです。 – ddw

2

カーソルオブジェクトの

del objects['_id'] 

を呼んでいます!

カーソルオブジェクトは明らかに結果セット全体にわたって反復可能であり、操作できる単一の ドキュメントではありません。

for obj in objects: 
    del obj['_id'] 

です。

だからあなたの主張は、次のコードに示すように、完全に間違っている:

import pymongo 

c = pymongo.Connection() 
db = c['mydb'] 
db.foo.remove({}) 
db.foo.save({'foo' : 42}) 

for row in db.foo.find(): 
    del row['_id'] 
    print row 



$ bin/python foo.py 

> {u'foo': 42} 
+0

ええと、もともと投稿する前にあなたのコードを試しました。しかし、どのようにこれらの入れ子になった辞書をクライアントに渡すことができる1つの辞書に組み込むのですか? また、私はカーソルオブジェクトをdelしようとしていたことに気づきました。だから、「辞書ではありませんが、各結果を辞書として繰り返す必要があります。たぶん私は私の発見プロセスを廃止すべきだったが、私はより多くの情報が良いと思った。 – ddw

関連する問題