带日期的mongo查询无法按预期工作

时间:2016-06-10 05:56:07

标签: java mongodb

我有一个由以下java驱动程序生成的查询:

{ "$and" : [
    { "source_ip" : "10.0.71.218"} , 
    { "login" : { "$lte" : { "$date" : "2016-06-03T00:17:18.000Z"}}} , 
    { "$or" : [ 
        { "logout" : { "$exists" : false}} , 
        { "logout" : { "$gte" : { "$date" : "2016-06-03T00:17:18.000Z"}}}
        ]
    }
    ]
}

这不会正确返回数据。但是,使用ISODate()替换$ date,可以正确获取数据。我确实理解严格的'驱动程序使用JSON。但我不确定我在下面的java代码中错过了什么/做错了什么:

BasicDBObject logoutfilterQuery = new BasicDBObject();
List<BasicDBObject> lst_logoutfilter = new ArrayList<BasicDBObject>();
lst_logoutfilter.add(new BasicDBObject("logout", new BasicDBObject("$exists", false)));
lst_logoutfilter.add(new BasicDBObject("logout", new BasicDBObject("$gte", logtime)));

logoutfilterQuery.put("$or", lst_logoutfilter);

BasicDBObject fetch_pppoe_user_query = new BasicDBObject();
List<BasicDBObject> obj = new ArrayList<BasicDBObject>();
obj.add(new BasicDBObject("source_ip", sourceIP));
obj.add(new BasicDBObject("login", new BasicDBObject("$lte", logtime)));
obj.add(logoutfilterQuery);

fetch_pppoe_user_query.put("$and", obj);
BasicDBObject fields = new BasicDBObject();
fields.put("user", 1);
fields.put("login", 1);
fields.put("logout", 1);
DBCursor cursor = collection.find(fetch_pppoe_user_query, fields);

任何指针都将受到极大的赞赏。

示例文档:

{
    "_id" : ObjectId("5753f6821faca4f72daeb374"),
    "source_ip" : "10.0.181.163",
    "user" : "xyz@abc.com",
    "location" : "SOMEPLACE",
    "login" : ISODate("2016-06-01T12:43:35.000Z"),
    "logout" : ISODate("2016-06-01T12:45:18.000Z"),
    "connectionTimeInSeconds" : NumberLong(103),
    "datatransferIn" : NumberLong(54),
    "datatransferOut" : NumberLong(58),
    "packetsIn" : NumberLong(3),
    "packetsOut" : NumberLong(4)
}

1 个答案:

答案 0 :(得分:1)

以下是考虑时区的代码。我认为问题在于处理时区。通常,Mongo DB以UTC时区存储日期。

请根据您的要求相应更改集合名称和数据库名称。

 public static void main(String[] args) throws ParseException {
    String sourceIP = "10.0.181.163";

    SimpleDateFormat logtimeFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS\'Z\'");
    logtimeFormat.setTimeZone(TimeZone.getTimeZone("UTC"));

    Date logtime = logtimeFormat.parse("2016-06-01T12:45:01.000Z");

    MongoClient client = new MongoClient();
    MongoDatabase database = client.getDatabase("localhost");
    BasicDBObject logoutfilterQuery = new BasicDBObject();
    List<BasicDBObject> lst_logoutfilter = new ArrayList<BasicDBObject>();
    lst_logoutfilter.add(new BasicDBObject("logout", new BasicDBObject("$exists", false)));
    lst_logoutfilter.add(new BasicDBObject("logout", new BasicDBObject("$gte", logtime)));

    logoutfilterQuery.put("$or", lst_logoutfilter);

    BasicDBObject fetch_pppoe_user_query = new BasicDBObject();
    List<BasicDBObject> obj = new ArrayList<BasicDBObject>();
    obj.add(new BasicDBObject("source_ip", sourceIP));
    obj.add(new BasicDBObject("login", new BasicDBObject("$lte", logtime)));
    obj.add(logoutfilterQuery);
    fetch_pppoe_user_query.put("$and", obj);
    System.out.println(fetch_pppoe_user_query);
    FindIterable<Document> findDoc = database.getCollection("dateissue").find(fetch_pppoe_user_query);
    for (Document doc : findDoc) {
        System.out.println(doc.toJson());
    }
} 

以下是我的Mongo Collection。请注意日期值。

enter image description here