我有一个由以下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)
}
答案 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。请注意日期值。