gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:42:13 26 4
gpt4 key购买 nike

我有一个由下面的 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)
}

最佳答案

这是考虑时区的代码。我认为问题在于处理时区。通常,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

关于java - 带日期的 mongo 查询无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37740837/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com