2

为什么这些查询给了我非常不同的结果?

蒙哥版本:

    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()

爪哇版:

    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);

设置时区解决了这个问题。

谢谢。

4

0 回答 0