【问题标题】:Mongo DB + java query by dateMongodb + java 按日期查询
【发布时间】:2016-10-01 13:59:46
【问题描述】:

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

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

【问题讨论】:

    标签: java mongodb


    【解决方案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】:

      首先,您缺少当前驱动程序中的类;-)

      然后,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));
      

      编辑:另外一件事:您的文档将日期保存为字符串,因此将它们与日期进行比较是行不通的。确保在保存数据时也使用日期对象。当您通过 mongo shell 查询这些时,如果一切正确,它们应该看起来像 ISODate('2016-09-27T13:17:05.000Z')。

      【讨论】:

        【解决方案3】:

        由于您使用的是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);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-10-10
          • 1970-01-01
          • 2018-09-18
          • 1970-01-01
          • 2011-04-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多