Mongo DB +按日期查询java

时间:2016-09-29 06:37:47

标签: java mongodb

我是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}}

如何获取计数值,我真正缺少的。

3 个答案:

答案 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)

您使用$gtlt的相同日期。

这意味着您的查询在日期范围之间搜索数据,如下所示,

{ "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);