【问题标题】:MongoDB & web2py: Working with ObjectIdsMongoDB 和 web2py:使用 ObjectIds
【发布时间】:2014-10-28 17:43:21
【问题描述】:

我正在开发一个非常简单的应用程序,作为将 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}}

产品退回没有问题。但是,products._id 字段以“26086541625969213357181461154”形式返回值。如果我切换到 shell(或 python)并尝试根据这些 _id 查询我的数据库,我找不到任何产品。

如您所料,数据库中的 _id 是 ObjectId,类似于“544a481b2ceb7c3093a173a2”。我希望我的视图返回 ObjectIds 而不是长字符串。很简单,但我遇到了麻烦。

【问题讨论】:

    标签: python mongodb web2py objectid


    【解决方案1】:

    在为给定的 MongoDB 记录构造 DAL Row 对象时,ObjectId 通过 long(str(value), 16) 转换为 long 整数来表示。要转换回 ObjectId,可以使用 MongoDB 适配器的 object_id 方法:

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

    当然,如果您使用 DAL 查询 MongoDB,您不必担心这一点,因为它会自动处理转换。

    【讨论】:

      【解决方案2】:

      虽然这很有意义,但我无法让 Anthony 的回答奏效。所以,我只是破解了它:

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

      【讨论】:

      • 嗯,不知道为什么db._adapter.object_id 不适合你,但无论如何,它最终只会做hex(arg)[2:].rstrip('L').zfill(24),所以和你的代码基本相同。
      猜你喜欢
      • 2018-08-25
      • 2013-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-08
      • 2011-08-14
      • 1970-01-01
      • 2016-10-14
      相关资源
      最近更新 更多