我正在嘗試使用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與
{ _id : 0 }
但這並沒有與pymongo。 Pymongo documentation解釋說您可以列出您想要返回的字段,但「(」_id「將始終包含在內)」。真的嗎?有沒有辦法解決這個問題?我在這裏忽略了一些簡單而愚蠢的東西嗎?
你在這裏的實際主張是什麼?你的代碼創建一個新的字典是奇怪的,沒有必要的。你真正的問題是什麼? –
我的問題是.find({},{'_id':False})不排除_id。然而,這是我的代碼有問題,現在它正在工作。謝謝你的幫助。 – ddw
「但對象遊標爲空」:這是因爲您只能迭代一次,所以您需要迭代,獲取下一個字典,刪除'_id',將dict放入列表中,並在最後返回該列表,而不是對象。 –