为什么这些查询会给我带来截然不同的结果?
Mongo版本:
db.journeydata.find({"$or" : [{"Start Date" : {'$gte' : ISODate("2015-07-01T00:00:00Z"), '$lte' : ISODate("2015-07-01T01:00:00Z")}},
{"End Date" : {'$gte' : ISODate("2015-07-01T00:00:00Z"), '$lte' : ISODate("2015-07-01T01:00:00Z")}}]}).count()
Java版:
BasicDBObject c1 = new BasicDBObject();
c1.put("Start Date", BasicDBObjectBuilder.start("$gte", fromDate).add("$lt", toDate).get());
BasicDBObject c2 = new BasicDBObject();
c2.put("End Date", BasicDBObjectBuilder.start("$gte", fromDate).add("$lt", toDate).get());
BasicDBList or = new BasicDBList();
or.add(c1);
or.add(c2);
DBObject query = new BasicDBObject("$or", or);
final DBCursor dbCursor = journeyColl.find(query);
final List<DBObject> journeyDBObject = dbCursor.toArray();
final List<Journey> journeyList = new ArrayList<Journey>(journeyDBObject.size());
for (int i = 0; i < journeyDBObject.size(); i++){
final DBObject dbObject = journeyDBObject.get(i);
final Journey journey = createJourney(dbObject);
journeyList.add(journey);
}
其中,fromDate和toDate是Java.Util.Date的实例。我完全不知道为什么查询会给我不同的结果。他们应该给我相同的结果。有什么建议吗?
- 编辑:
这就是mongo profiler给我的:
query:{
"$or" : [
{
"Start Date" : {
"$gte" : ISODate("2015-06-30T23:00:00Z"),
"$lt" : ISODate("2015-07-01T00:00:00Z")
}
},
{
"End Date" : {
"$gte" : ISODate("2015-06-30T23:00:00Z"),
"$lt" : ISODate("2015-07-01T00:00:00Z")
}
}
]
}
我不知道为什么日期改变了?我怎么能避免这种情况?
- 编辑:
这是我生成日期的方式,我没有设置任何时区:
final String begin = "2015-7-1T00:00:00.000Z";
final String end = "2015-7-31T00:00:00.000Z";
final DateTimeFormatter parser = ISODateTimeFormat.dateTime();
final DateTime beginDateTime = parser.parseDateTime(begin);
final DateTime endDateTime = parser.parseDateTime(end);
---编辑:
final DateTimeFormatter parser = ISODateTimeFormat.dateTime().withZone(DateTimeZone.UTC);
设置时区解决了这个问题。
感谢。