2012-08-29 68 views
15

我對以下問題感到困惑。使用Flask-pymongo擴展名_id在MongoDB中搜索文檔

我用的燒瓶,燒瓶pymongo擴展,MongoDB的版本V2.2.0,RC0,pdfile 4.5版

這是我的路線:

@app.route("/check/<id>") 
def check(id): 
    doc=conn.db.msg.find_one({'_id':id}) 
    return render_template('base.html',name=doc) 

的ID是從文檔的有效_id在msg集合中,但總是返回None。

我曾嘗試:

  • 考取了的ObjectId(ID),但返回的errortype:OBJECTID不可調用的
  • 考取ID作爲STR(id)返回無

有什麼想法?

UPDATE: 這個完整的URL看起來像:

http://127.0.0.1:8000/check/5030b628895b800de1a9a792 

UPDATE2:

我發現(答案)的紅寶石類似的問題。不知道我怎麼能把它翻譯成python,我需要什麼樣的import/modules?

How can I retrieve a document by _id?

UPDATE3: 我想:

import bson 
@app.route("/check/<id>") 
def check(id): 
id2="'"+id+"'" 
doc=conn.db.msg.find_one({'_id':bson.objectid(id2) }) 
return render_template('base.html',name=doc) 

,但我得到類型錯誤: '模塊' 對象不是可調用(它不具有ID工作,要麼)

當我達到1500我會建議沮喪標籤:-S

UPDATE4:

最後我把它弄起來&正在運行!

這裏是我的解決方案:

import bson 
@app.route("/check/<id>") 
def check(id): 
doc=conn.db.msg.find_one({'_id':bson.ObjectId(oid=str(id))}) 
return render_template('base.html',name=doc) 

回答

29

你可能也想嘗試使用ObjectIdbson.objectid模塊,像這樣:

from bson.objectid import ObjectId 

在這種情況下,你不會需要提供oid kwarg。你只是在做這樣的事情:

db_conn.msg.find_one({'_id': ObjectId(my_oid)}) 
+0

我試圖pymongo.objectid(ID)和沒有工作...現在我知道爲什麼....謝謝 – Altons

+0

高興你得到它的工作! – aezell

+0

順便說一句,我們要更新PyMongo文檔的下一個版本,警告人們瞭解這個陷阱: https://github.com/mongodb/mongo-python-driver/commit/dcf546f0b08e59d0d2c4f09a08fd9fe07017256a 希望有所幫助。 –