【问题标题】:Mongodb + Java Drivers. Search by date rangeMongodb + Java 驱动程序。按日期范围搜索
【发布时间】:2014-11-25 21:32:22
【问题描述】:

这是我第一次使用带有 java 驱动程序的 Mongodb。我可以使用 javascript 和 Date() 对象通过命令行查询数据库,但是,我在使用驱动程序时遇到了问题。根据我的查询,任何人都可以看到问题所在吗?谢谢

            Date current = new Date();
            DBCollection coll = db.getCollection("messages");

            BasicDBObject query = new BasicDBObject("created_on", new BasicDBObject("$gte", new Date(current.getYear(), current.getMonth(), current.getDate())).
                    append("created_on", new BasicDBObject("$lt", new Date(current.getYear(), current.getMonth() - 1, current.getDate()))));

            System.out.println("Query: " + query);


            DBCursor cursor = coll.find(query);

查询:{“created_on”:{“$gte”:{“$date”: “2012-12-06T05:00:00.000Z”},“created_on”:{“$lt”:{“$date”: “2012-11-06T05:00:00.000Z”}}}}

附:如果不是很明显,我正在尝试查找上个月内的所有记录。

【问题讨论】:

    标签: java mongodb date


    【解决方案1】:

    似乎您构建的查询错误。请尝试以下方法:

    BasicDBObject query = new BasicDBObject("created_on", //
                          new BasicDBObject("$gte", new DateTime().toDate()).append("$lt", new DateTime().toDate()));
    

    Datetime 对象是一个在 java 中简化日期操作的库。你可以检查一下。 http://joda-time.sourceforge.net/

    此外,morphia 是一个不错的 java 对象文档映射器 (ODM) 框架,用于通过 java 驱动程序与 mongodb 一起工作。它简化了通过 java 的查询。

    https://github.com/jmkgreen/morphia

    【讨论】:

      【解决方案2】:

      根据输出的查询,您正在查找包含字段created_on 的文档,该文档还有一个名为created_on 的子字段。我认为不存在这样的文件。换句话说,您的查询格式不正确。

      您的查询对象应如下所示:

      BasicDBObject dateRange = new BasicDBObject ("$gte", new Date(current.getYear(), current.getMonth(), current.getDate());
      dateRange.put("$lt", new Date(current.getYear(), current.getMonth() - 1, current.getDate());
      
      BasicDBObject query = new BasicDBObject("created_on", dateRange);
      

      此外,作为侧边栏,您可能应该避免使用 java.util.Date 类的三参数构造函数,因为它已被弃用。在 MongoDB Java 驱动程序中处理日期时,我通常使用java.util.Calendar 类及其getTime() 方法。

      【讨论】:

      • 我仍然没有得到任何结果。这是新的打印查询: db.messages.find({ "created_on" : { "$gte" : { "$date" : "2012-11-06T05:00:00.000Z"} , "$lt" : { "$date" : "2012-12-06T05:00:00.000Z"}}});
      • ..另外,我知道那里有数据。此查询从终端运行..db.messages.find({created_on: {$gte: new Date(2012,11,6), $lt: new Date(2012,12,6)}});
      • javascript Date 对象有一个索引为 0 的月份字段。 new Date(2012,11,6) 实际上是 2012 年 12 月 6 日。不确定这是否会改变任何内容,但这可能是您获得控制台查询结果而不是驱动程序结果的原因。
      • 对,我意识到这一点。这就是我从 Java 驱动程序查询中减去一个月的原因。另外,我在您提供的查询中切换了日期范围,因为它们是向后的。
      【解决方案3】:

      我之前没有用过mongo的Java驱动,但是你创建的查询好像不正确。

      Query: { "created_on" : { "$gte" : { "$date" : "2012-12-06T05:00:00.000Z"} , "created_on" : { "$lt" : { "$date" : "2012-11-06T05:00:00.000Z"}}}}
      

      查询实际上最终应该是这样的:

      Query: { "created_on" : {$gte: start, $lt: end}}
      

      开始和结束是日期。您第二次引用“created_on”似乎是不必要的,实际上可能会破坏您的查询。

      注意:我还没有机会测试这个理论,但我在 http://cookbook.mongodb.org/patterns/date_range/ 工作,这似乎与手头的问题非常相关。

      【讨论】:

      • 我同意你的看法。出于某种原因,java 驱动程序创建了一个似乎不起作用的奇怪查询。我暂时放弃了这个。不过谢谢!
      【解决方案4】:

      Jodatime 库非常好用,请使用 DateTimeZone.UTC 作为 DateTime 的时区参数。设置时区后,您将获得准确的结果。试试这个

          Calendar cal = Calendar.getInstance();
          //get current year,month & day using Calender
          int year=cal.get(Calendar.YEAR);
          int monthNumber=cal.get(Calendar.MONTH);
          int dateNumber=cal.get(Calendar.DAY_OF_MONTH);
          monthNumber+=1;
      
      
          BasicDBObject query = new BasicDBObject("dateCreated",new BasicDBObject("$gte", new DateTime(year, monthNumber, dateNumber, 0, 0,DateTimeZone.UTC).toDate()).append("$lte",new DateTime(year, monthNumber, dateNumber, 23, 59,DateTimeZone.UTC).toDate()));
      
          System.out.println("formed query: "+query);
      
          DBCursor cursor = collection.find(query);
          while(cursor.hasNext())
          {
              System.out.println("found doc in given time range: "+cursor.next().toString());
          }
      

      【讨论】:

        猜你喜欢
        • 2016-06-19
        • 2015-04-25
        • 1970-01-01
        • 2018-12-30
        • 2018-06-23
        • 2015-10-06
        • 2018-09-19
        • 2014-07-23
        • 1970-01-01
        相关资源
        最近更新 更多