2014-10-28 81 views
1

我正在研究一個非常簡單的應用程序,作爲將MongoDB與web2py集成的用例。在應用程序的一個部分,我感興趣的是返回一個產品列表:MongoDB&web2py:使用ObjectIds

我的數據庫表:

db.define_table('products', 
Field('brand', label='Brand'), 
Field('photo', label='Photo'), 
... 
Field('options', label='Options')) 

我的控制器:

def products(): 
qset = db(db['products']) 
grid = qset.select() 
return dict(grid=grid) 

我的觀點:

{{extend 'layout.html'}} 
<h2>Product List</h2> 
{{=grid}} 

產品退還沒有問題。但是,products._id字段以「26086541625969213357181461154」的形式返回值。如果我切換到shell(或python)並嘗試根據這些_ids查詢我的數據庫,我找不到任何產品。

正如您所料,數據庫中的_ids是ObjectIds,它看起來像是'544a481b2ceb7c3093a173a2'。我想我的觀點返回ObjectIds而不是長字符串。很簡單,但我遇到了麻煩。

回答

1

儘管這很有道理,但我無法讓安東尼的答案奏效。因此,我就砍死它:

hex(value).replace("0x","").replace("L","") 
+0

嗯,不知道爲什麼'db._adapter.object_id'不爲你工作,但在任何情況下,它只是在最後也做'十六進制(ARG)[2: ] .rstrip('L').zfill(24)',因此大部分與您的代碼相同。 – Anthony 2014-11-03 00:37:48

1

當爲給定的MongoDB記錄構造DAL 對象時,ObjectId通過long(str(value), 16)轉換爲long整數來表示。若要重新轉換爲的ObjectId,您可以使用MongoDB的適配器object_id方法:

object_id = db._adapter.object_id('26086541625969213357181461154') 

當然,如果你使用的DAL查詢MongoDB的,你不必擔心這一點,因爲它處理自動轉換。