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にはこれに簡単に対処する方法がないことにもショックを受けます。
{ _id : 0 }
に_idを除外することができますしかし、それはpymongoと何もしないことを説明しています。 Pymongo documentationは、返信するフィールドを一覧表示することができますが、 "(" _id "は常に含まれる)ことを説明しています。"真剣に?これを回避する方法はありませんか?私はここで見落としている単純で愚かなものがありますか?
あなたの実際の主張は何ですか?新しい辞書を作成するためのあなたのコードは奇妙で、必要ではありません。あなたの本当の問題は何ですか? –
私の問題は、.find({}、{'_id':False})は_idを除外していないということでした。しかし、それは私のコードに問題があり、現在は動作しています。ご協力いただきありがとうございます。 – ddw
"オブジェクトのカーソルは空です":これは1回だけ反復できるので、反復し、次のdictを取得し、 '_id'を削除し、dictをリストに入れ、最後にリストを返す必要があるからですオブジェクト。 –