繁体   English   中英

Mongo DB + Java按日期查询

[英]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')。

$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);

希望这可以帮助。

由于您正在使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM