【问题标题】:Java MongoDB Query Criteria (WHERE date > X and field = value) Ignores Second ClauseJava MongoDB 查询条件(WHERE date > X and field = value)忽略第二个子句
【发布时间】:2012-08-20 15:41:16
【问题描述】:
import java.util.Date;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;

public class CustomQuery {

  @Autowired private MongoOperations mongoOperations;    

  public void customQuery(Date submittalDate) {

     List<Question> q1s = mongoOperations.find(
        new Query(Criteria.where("category").is("New")), 
        Question.class);

     List<Question> q2s = mongoOperations.find(
      new Query(
        Criteria.where("submittalDate").gt(submittalDate).and("category").is("New")
      ),
      Question.class);
  }
}

顶部的 Spring Java MongoDB 查询返回 q1s 中的预期结果。

底部查询应返回顶部查询的子集。相反,匹配("submittalDate").gt(submittalDate) 的记录会出现在q2s 结果中,无论它们是否属于“新”类别。

即就像第二个查询中的and("category").is("New") 被忽略了。

使用带有 Spring Data 的 Mongodb v2.0.6 32 位版本。

帮助表示赞赏。

2012 年 5 月 9 日更新

还是不行

2012 年 8 月 26 日更新

这会在 Mongo 命令行上返回结果:

db.foo.find( {   "submittalDate":{ "$gte": ISODate("2012-07-31T23:00:00.000Z")  }, "category" : "New"    } )

相比之下,Java 代码(对于相同的日期参数)不起作用。作为比较,DEBUG 从 Java 记录的查询是:

[DEBUG] [http-8080-1] (MongoTemplate.java:doFind:1256) find using query: 
{ "submittalDate" : { "$gte" : { "$date" : "2012-07-31T23:00:00.000Z"}} , "category" : "New"} 

是的,日志记录了一个日期字符串,而为了让 Mongo shell 正常工作,我需要使用 ISODate(..)。 但是我正在使用具有可接受类型的 java.util.Date 的 MongoDB Java 驱动程序 - ISODate(..) 怎么可能没有出现问题?问题可能有其他原因。

【问题讨论】:

  • 查询结构对我来说是正确的。能否在 org.springframework.data.document.mongodb 上启用 DEBUG 以查看正在执行的实际查询。
  • 谢谢,我会用那个 DEBUG 试一试...(我已经使用 Eclipse 通过它进行断点,它“似乎”合乎逻辑)

标签: java mongodb-java


【解决方案1】:

我不是弹簧专家,但您的某些导入似乎可能相互冲突。鉴于我查看过的文档,很难准确诊断出哪里出错了。如果您没有为此使用 spring 框架,则可以使用以下替代/更常见的方法。

import com.mongodb.Mongo;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import com.mongodb.DBCursor;

public class CustomQuery {

public void customQuery(Date submittalDate)
{
        document = new BasicDBObject();
        document.put(("submittalDate").greaterThanEquals(submittalDate).put("category").is("New").get());
        DBCursor cursor = getDbCollection().find(document); 

}

}

【讨论】:

  • 该代码不会在以 document.put(
【解决方案2】:
{ "$date" : "2012-07-31T23:00:00.000Z"}

等于

Date("2012-07-31T23:00:00.000Z")

Date("2012-07-31T23:00:00.000Z") 将返回一个字符串,而不是 ISODate()。

通过http://www.mongodb.org/display/DOCS/Mongo+Extended+JSON

我认为这是org.springframework.data.mongodb.core.query.Criteria的错误。

【讨论】:

    猜你喜欢
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    • 2012-09-18
    • 2012-12-29
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    相关资源
    最近更新 更多