我是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}}
如何获取计数值,我真正缺少的。
答案 0 :(得分:1)
首先,您缺少当前驱动程序中的类; - )
然后,find返回一个iterable或DBCursor(取决于版本),需要迭代才能生成有用的文档。必须阅读和分析这些文件。
最后,如果您只对计数感兴趣,那么您可能不想使用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));
编辑:另外一件事:您的文档将日期保存为字符串,因此将它们与日期进行比较将不起作用。确保在保存数据时也使用Date对象。当你通过mongo shell查询这些内容时,当一切正确时,它们应该看起来像ISODate(' 2016-09-27T13:17:05.000Z')。
答案 1 :(得分:1)
您使用$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);
希望这有帮助。
答案 2 :(得分: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);