2012-09-10 76 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與

{ _id : 0 } 

但這並沒有與pymongo。 Pymongo documentation解釋說您可以列出您想要返回的字段,但「(」_id「將始終包含在內)」。真的嗎?有沒有辦法解決這個問題?我在這裏忽略了一些簡單而愚蠢的東西嗎?

+0

你在這裏的實際主張是什麼?你的代碼創建一個新的字典是奇怪的,沒有必要的。你真正的問題是什麼? –

+0

我的問題是.find({},{'_id':False})不排除_id。然而,這是我的代碼有問題,現在它正在工作。謝謝你的幫助。 – ddw

+0

「但對象遊標爲空」:這是因爲您只能迭代一次,所以您需要迭代,獲取下一個字典,刪除'_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

是的,我最初發布之前也試過你的代碼。但是,如何將這些嵌套字典合併成一個可傳遞給客戶端的字典呢? 另外,我意識到我試圖刪除一個遊標對象,這就是爲什麼我說「所以它不是一個字典,但我必須迭代每個結果作爲一個字典。」也許我應該放棄我的發現過程,但我認爲越多越好。 – ddw