2014-10-28 37 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的,你不必担心这一点,因为它处理自动转换。