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日以来创建的所有文档,如下所示:
Foo.where(:created_at.gt=>Time.parse("2011-12-01"))(它映射到:
{created_at: {"$gt"=>Thu Dec 01 06:00:00 UTC 2011}}我不知道如何使用ObjectId进行等价的查询。我想它看起来应该是这样的(虽然generation_time显然是一个拼音函数,但是在mongo查询的上下文中,我可以在objectid上使用一个等价的函数吗?)
Foo.where('$where'=>"this.id.generation_time > new Date('2011-12-01')")
{$where: "this.id.generation_time > new Date('2011-12-01')"}另一个问题:如果我放弃存储单独的时间戳,如果我使用mongodump转储和恢复数据库,我会丢失时间戳元数据吗?有没有推荐的备份/恢复技术来保留ObjectIds?
发布于 2011-12-24 05:34:50
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,因此您无需担心。
https://stackoverflow.com/questions/8620436
复制相似问题