John Nunemaker 有一篇博客文章,其中包含一些有关 Mongo ObjectIds 的好技巧 -- http://mongotips.com/b/a-few-objectid-tricks/ -- 我特别对有关 Generation_time 的提示感兴趣。他建议没有必要将created_at时间显式存储在mongo文档中,因为你总是可以从ID中提取它,这引起了我的注意。问题是,如果我只有 id,我无法弄清楚如何在 mongomapper 中生成 mongo 查询以根据创建时间查找文档。
如果我将键 :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 转储和恢复数据库,我是否会丢失时间戳元数据?是否有推荐的备份/恢复技术来保留 ObjectId?
最佳答案
this
是在 shell 中运行的 javascript 代码,但生成时间是一个 mongomapper 方法,因此它在您拥有的代码中没有意义。
在 Rails 中,你可以通过说类似的内容来获取 id
created_at = self.id.generation_time.in_time_zone(Time.zone)
其中 self 指的是 Foo 的实例。
你会这样询问
Foo.find('_id' => {'$gte' => BSON::ObjectId.from_time(created_at)}).count
为什么要这么麻烦...麻烦不值得,只需存储时间即可。
关于备份/恢复技术,除非您手动读取并重新插入 mongodump/restore,否则类似的工具将保留对象 ID,因此您无需担心。
关于ruby-on-rails-3 - 在 mongo id 上查询 Generation_time,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8620436/