MongoDB与web2py:处理ObjectId

1 投票
2 回答
1107 浏览
提问于 2025-04-30 05:12

我正在做一个非常简单的应用程序,目的是把MongoDB和web2py结合起来。在这个应用的一个部分,我想返回一个产品列表:

我的数据库表:

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}}

产品能够顺利返回。不过,产品的_id字段返回的值是像'26086541625969213357181461154'这样的长字符串。如果我切换到命令行(或者python),试图根据这些_id去查询我的数据库,我找不到任何产品。

正如你所想的,数据库中的_id是ObjectId,看起来像这样'544a481b2ceb7c3093a173a2'。我希望我的视图能返回ObjectId,而不是那些长字符串。这很简单,但我在这方面遇到了一些麻烦。

暂无标签

2 个回答

1

在为某个MongoDB记录构建DAL的Row对象时,ObjectId会通过long(str(value), 16)的方式转换成一个long整数。如果你想把它转换回ObjectId,可以使用MongoDB适配器的object_id方法:

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

当然,如果你使用DAL来查询MongoDB,就不需要担心这个问题,因为它会自动处理转换。

1

虽然这个方法听起来很合理,但我没能让安东尼的回答奏效。所以,我就自己动手改了一下:

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

撰写回答