比较MongoDB中的日期差距

时间:2013-12-07 00:43:25

标签: mongodb date

我有一个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特定方法实际上并不是一个选项,因为我正在使用抽象层访问数据库,我需要查询才能工作

1 个答案:

答案 0 :(得分:0)

这应该在查询中起作用:

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/