在mongo id上查询generation_time

时间:2011-12-23 20:41:45

标签: ruby-on-rails-3 mongodb mongomapper

John Nunemaker有一篇博文,其中有一些关于Mongo ObjectIds的好建议 - http://mongotips.com/b/a-few-objectid-tricks/ - 特别是我对有关generation_time的提示很感兴趣。他建议没有必要在mongo文档中明确存储created_at时间,因为你总是可以从ID中提取它,这引起了我的注意。问题是我无法弄清楚如何在mongomapper中生成mongo查询,以便根据创建时间查找文档,如果我拥有的是id。

如果我存储一个密钥:created_at作为文档的一部分,我可以在mongomapper中进行查询,以获得自12月1日以来创建的所有文档:

Foo.where(:created_at.gt=>Time.parse("2011-12-01"))

(映射到:

{created_at: {"$gt"=>Thu Dec 01 06:00:00 UTC 2011}}

我无法弄清楚如何使用ObjectId进行等效查询..我想它看起来像这样(虽然显然generation_time是一个ruby函数,但是有一个等价我可以在objectid上使用mongo查询的上下文?)

Foo.where('$where'=>"this.id.generation_time > new Date('2011-12-01')")
{$where: "this.id.generation_time > new Date('2011-12-01')"}

还有一个问题:如果我放弃存储单独的时间戳,如果我使用mongodump转储和恢复数据库,是否会丢失时间戳元数据?是否存在保留ObjectIds的推荐备份/恢复技术?

1 个答案:

答案 0 :(得分:2)

this是javascript代码,它将在shell中运行,但生成时间是一个mongomapper方法,所以它在你的代码中没有意义。

在rails中你可以通过说出像

这样的内容来获得id
created_at = self.id.generation_time.in_time_zone(Time.zone)

自我指的是Foo的一个实例。

您可以通过说

来查询
Foo.find('_id' => {'$gte' => BSON::ObjectId.from_time(created_at)}).count

为什么这么麻烦......麻烦不值得,只是把时间存下来。

关于备份/恢复技术,除非您手动读取并重新插入mongodump / restore,否则类似的工具将保留对象ID,因此您无需担心。