首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查询mongo ids上的generation_time

查询mongo ids上的generation_time
EN

Stack Overflow用户
提问于 2011-12-24 04:41:45
回答 1查看 1.3K关注 0票数 2

John Nunemaker有一篇关于Mongo ObjectIds -- http://mongotips.com/b/a-few-objectid-tricks/的很好的技巧的博客文章--特别是我对关于generation_time的技巧很感兴趣。他建议没有必要在mongo文档中显式存储created_at时间,因为您总是可以从ID中提取它,这引起了我的注意。问题是,如果我只有id,我不知道如何在mongomapper中生成mongo查询,以便根据创建时间查找文档。

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

代码语言:javascript
复制
Foo.where(:created_at.gt=>Time.parse("2011-12-01"))

(它映射到:

代码语言:javascript
复制
{created_at: {"$gt"=>Thu Dec 01 06:00:00 UTC 2011}}

我不知道如何使用ObjectId进行等价的查询。我想它看起来应该是这样的(虽然generation_time显然是一个拼音函数,但是在mongo查询的上下文中,我可以在objectid上使用一个等价的函数吗?)

代码语言:javascript
复制
Foo.where('$where'=>"this.id.generation_time > new Date('2011-12-01')")
{$where: "this.id.generation_time > new Date('2011-12-01')"}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-24 05:34:50

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

在rails中,您可以通过如下所示获得id

代码语言:javascript
复制
created_at = self.id.generation_time.in_time_zone(Time.zone)

其中self指的是Foo的实例。

你可以这样问:

代码语言:javascript
复制
Foo.find('_id' => {'$gte' => BSON::ObjectId.from_time(created_at)}).count

为什么要费心呢……麻烦是不值得的,只要储存时间就行了。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8620436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档