【问题标题】:Comparing date gaps in MongoDB比较 MongoDB 中的日期间隔
【发布时间】:2013-12-07 09:49:55
【问题描述】:

我在 MongoDB 中有一个只有一条记录的集合:

> db.tabMessages.find( )

{ "tabId" : ObjectId("52a26579dc05b7a660ee12b1"),
  "fromUserId" : ObjectId("52a0ff959cad3f55275bd790"),
  "added" : ISODate("2013-12-07T00:02:42.490Z"), 
  "_id" : ObjectId("52a265a2dc05b7a660ee12ba") }

我想删除“过期”标签消息。想到的查询是:

db.tabMessages.find( { added: { $lte: ISODate() - ( 15 * 60000 )  } } )

这应该会删除所有超过 15 分钟的条目。然而……它没有。 为了完成这项工作,我必须写:

db.tabMessages.find( { added: { $lte: new Date( ISODate() - ( 15 * 60000 ) ) } } )

当我执行 ISODate() - ( 15 * 60000 ) 时,Mongo 似乎将 ISODate() 对象转换为时间戳,此时与存储在数据库中的日期对象的任何比较都将失败。

现在...我是不是要疯了,或者这实际上是怎么回事?如果是这种情况,我正在考虑将所有内容存储为 UTC 时间戳,并避免出现任何此类混乱问题。

想法?

注意:我追求的是非 mongo 特定的答案,如果存在的话。使用 Mongo 的 TTL 或 Mongo 的 ISODate 特定方法并不是一个真正的选择,因为我正在使用抽象层访问数据库,并且无论如何我都需要查询来工作

【问题讨论】:

  • 那么您到底在寻找什么。一个人会在某个神奇的抽象层(没有人知道它的样子)中为您编写查询,无论任何抽象层都有效吗?

标签: mongodb date


【解决方案1】:

这应该在查询中起作用:

db.tabMessages.find({ 
    added: { 
       $lte: ISODate().setTimestamp(ISODate().getTimestamp() - ( 15 * 60000 )) 
    } 
});

另一种方法是为集合设置 TTL,mongo 将为您完成工作:

db.tabMessages.ensureIndex( { "added": 1 }, { expireAfterSeconds: 900000 } )

http://docs.mongodb.org/manual/tutorial/expire-data/

【讨论】:

  • 对不起,我实际上是从 NodeJS 运行查询。我在这里使用 Mongo Shell 只是为了尽可能简化我的问题......
  • 我正在使用一个DB层来使用Mongo(simpledblayer,我自己写的)。所以,我可能会使用 MySql、MongoDB、counchdb 进行查询......我在寻找一个非 mongo 特定的答案(抱歉,我没有指定它)
猜你喜欢
  • 1970-01-01
  • 2013-09-17
  • 2015-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多