为什么Mongo查询和Java Mongo Driver查询给出了非常不同的结果?

时间:2016-02-22 03:24:41

标签: java mongodb date mongodb-query isodate

为什么这些查询会给我带来截然不同的结果?

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

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

感谢。

0 个答案:

没有答案