ruby-on-rails-3 - 在 mongo id 上查询 Generation_time

标签 ruby-on-rails-3 mongodb mongomapper

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/

相关文章:

testing - 为什么 Diaspora 应用程序中的这个测试没有失败?

ruby-on-rails - 在运行时在 Rails 3 中加载 gem

MongoDB-CR 身份验证失败

ruby-on-rails - 让 Gmaps4Rails 与 MongoMapper 一起工作

c# - Mongo DB 文档反序列化为 C# 对象的一个​​属性失败

MongoDB 的 mapReduce : partition keys to single reducers and affect key sorting

Ruby Sinatra - 在 mongoHQ 上连接到 mongoDB 失败

ruby-on-rails - 您如何使用 where 子句执行 Rails 3 select IN

ruby-on-rails - 如何在 Rails 应用程序中覆盖 gem 生成器模板

jquery - 供应商目录中的 Assets 未使用 Rails 中的 require_tree 加载