![](/img/trans.png)
[英]Mongo DB Date Difference and and query condtion in same query in Java Mongo Template
[英]Mongo DB + java query by date
我是Mongo DB的新手,并使用java mongo驱动程序从我的java类中从mongo db获取数据。
我在收藏中有以下几行。
{
"_id" : "13dded92-a9c0-48f8-9522-7422e2c7c2b6",
"E_MAIL" : "Anonymous_User",
"CITY" : "New York",
"COUNTRY" : "USA",
"OPERATING_SYSTEM" : "WINDOWS_10",
"DATE_TIME" : "27-08-2016 09:47:17",
"TOKEN" : "t76be55otr6galp4prc0f5k7bu"
}
{
"_id" : "13dded92-a9c0-48f8-9522-7422e2c7c2b6",
"E_MAIL" : "Anonymous_User",
"CITY" : "New York",
"COUNTRY" : "USA",
"OPERATING_SYSTEM" : "WINDOWS_10",
"DATE_TIME" : "27-08-2016 09:47:17",
"TOKEN" : "t76be55otr6galp4prc0f5k7bu"
}
{
"_id" : "13dded92-a9c0-48f8-9522-7422e2c7c2b6",
"E_MAIL" : "Anonymous_User",
"CITY" : "New York",
"COUNTRY" : "USA",
"OPERATING_SYSTEM" : "WINDOWS_10",
"DATE_TIME" : "24-08-2016 09:47:17",
"TOKEN" : "t76be55otr6galp4prc0f5k7bu"
}
{
"_id" : "13dded92-a9c0-48f8-9522-7422e2c7c2b6",
"E_MAIL" : "Anonymous_User"
"CITY" : "New York",
"COUNTRY" : "USA",
"OPERATING_SYSTEM" : "WINDOWS_10",
"DATE_TIME" : "22-08-2016 09:47:17",
"TOKEN" : "t76be55otr6galp4prc0f5k7bu"
}
我正在尝试按日期对它们进行分组,因此这应将结果的日期作为2传递给27-08-2016
为此,我在Java类中尝试了以下代码。
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import javax.mail.MessagingException;
import javax.mail.internet.AddressException;
import org.bson.Document;
import org.bson.conversions.Bson;
import com.mongodb.AggregationOutput;
import com.mongodb.BasicDBObject;
import com.mongodb.BasicDBObjectBuilder;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;
public class Same {
public static void main(String[] args) throws AddressException, MessagingException {
try {
MongoClient mongoClient = new MongoClient("localhost", 27017);
DBCollection collection;
DB db = mongoClient.getDB("myDB");
collection = db.getCollection("myCollection");
SimpleDateFormat simpleDateFormat = new SimpleDateFormat ("yyyy.MM.dd");
String date ="2016.08.27";
String date1 ="2016.08.27";
Date startDate = simpleDateFormat.parse(date);
Date endDate = simpleDateFormat.parse(date1);
BasicDBObject query1 = new BasicDBObject("LOGIN", new BasicDBObject("$gte",startDate).append("$lt",endDate ));
collection.find(query1);
System.out.println("count");
System.out.println(collection.find(query1));
mongoClient.close();
} catch (Exception e) {
System.err.println(e.getClass().getName() + ": " + e.getMessage());
}
}
}
我正在获得控制台,如下所示:
count
DBCursor{collection=DBCollection{database=DB{name='myDB'}, name='myCollection'}, find=FindOptions{, batchSize=0, limit=0, modifiers=null, projection=null, maxTimeMS=0, skip=0, sort=null, cursorType=NonTailable, noCursorTimeout=false, oplogReplay=false, partial=false}}
如何在这里获得计数值,我真正想念的是什么。
首先,您缺少当前驱动程序中的类;-)
然后,find返回一个可迭代的或DBCursor(取决于版本),需要对其进行迭代以生成有用的文档。 这些文件必须阅读和分析。
最后,如果您只对count感兴趣,则可能不想使用find(),而是使用count()。
不使用不推荐使用的东西的示例:
MongoCollection collection = mongoClient.getDatabase("myDB").getCollection("myCollection");
... (prepare dates)
Bson query = Filters.and(
Filters.gte("fieldName", startDate),
Filters.lt("fieldName", endDate));
System.out.println(collection.count(query));
编辑:另一件事:您的文档将日期保存为字符串 ,因此将它们与日期进行比较将不起作用。 确保在保存数据时也使用日期对象。 当您通过mongo shell查询它们时,当一切正确时,它们应该看起来像ISODate('2016-09-27T13:17:05.000Z')。
$gt
和lt
使用相同的日期。
这意味着您的查询将在以下日期范围内搜索数据,
{ "LOGIN" :
{ "$gte" : { "$date" : "2016-08-27T18:30:00.000Z"} ,
"$lt" : { "$date" : "2016-08-27T18:30:00.000Z"}
}
}
这什么也不会返回。
尝试减少开始日期中的日期,如下所示
SimpleDateFormat simpleDateFormat = new SimpleDateFormat ("yyyy.MM.dd");
String date ="2016.08.26";
String date1 ="2016.08.27";
Date startDate = simpleDateFormat.parse(date);
Date endDate = simpleDateFormat.parse(date1);
这应该为您工作并返回数据。
您可以根据您的模式更改时间以进行匹配。
startDate .setHours(0);
startDate .setMinutes(0);
希望这可以帮助。
由于您正在使用BasicDBObject
我认为您正在使用mongo-java-driver-2.14.2
或更旧的版本。 但是,要正确运行查询,您必须将其分配给游标:
DBCursor cursor = coll.find(query1);
现在您可以遍历此光标:
try {
while(cursor.hasNext()) {
System.out.println(cursor.next());
}
} finally {
cursor.close();
}
现在,您的查询可能不适合您的目标。 如果要检索光标引用的文档数,则可以使用:
BasicDBObject query1 = new BasicDBObject("fieldName", new BasicDBObject("$gte",startDate).append("$lt",endDate ));
long count = db.collection.find(query1).count()
System.out.println("count: " + count);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.