【问题标题】:querying generation_time on mongo ids在 mongo id 上查询 generation_time
【发布时间】:2011-12-23 20:41:44
【问题描述】:

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?

【问题讨论】:

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


    【解决方案1】:

    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,因此您无需担心。

    【讨论】:

    • 好的,这里的想法是将 id 与我查询时创建的 id 进行比较。那么 Id 会随着生成时间单调递增?
    猜你喜欢
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    相关资源
    最近更新 更多