1

我们在 mongodb 中有一个 user_audit 实体(表),它存储所有登录/注销信息。例如,

"_id" : ObjectId("5228cf0156961de6693b74c0"),
"active" : true,
"fname" : "Tom",
"lastlogin" : ISODate("2013-09-05T18:35:45.608Z"),
"lastloginip" : "0:0:0:0:0:0:0:1",
"lname" : "Bailey",
"lastlogout" : ISODate("2013-09-05T18:36:45.568Z"),

该表在生产中有数千条记录。

现在,管理员想要查找特定日期的所有登录。由于“lastlogin”字段中附加到 ISODate 的“时间”信息,我无法查找日期的精确匹配。在 Java 中,new Date() 已用于插入此字段值。问题是特定日期登录的时间信息不断变化。

试过了,

query.put("lastlogin", new BasicDBObject("$lte", givenDate).append("$gte", givenDate));

显然它不会返回结果,因为日期的时间部分不匹配。

从 Java 传递给 mongo 的查询是:

 query={ "lastlogin" : { "$lte" : { "$date" : "2013-09-05T04:00:00.000Z"} , "$gte" : {     
"$date" : "2013-09-05T04:00:00.000Z"}}}

[注意:如果我们在 java 中使用 MM_dd_yyyy 格式化,它总是默认为 04:00:00.000Z,不知道为什么..]

问题是我们在生产数据库中有很多记录。对于新记录,我可以在从 Java 插入之前将时间部分清空。但是对于现有的记录,不知道如何处理。如何获取给定日期的记录?

4

1 回答 1

0

根据mongodb cookbook,您的方向是正确的。你可能只是查询类似的东西

query.put("lastlogin", new BasicDBObject("$lt", givenDatePlusOneDay).append("$gte", givenDateAt00h00min));

这是一个间隔而不是同一日期。

于 2013-09-05T09:45:59.367 回答