Java MongoDB查询条件(WHERE date > X and field = value)忽略了第二个子句。

5
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结果中,无论它们是否在“New”类别中。
也就是说,第二个查询中的and(“category”).is(“New”)好像被忽略了。
使用Spring Data和Mongodb版本v2.0.6 32位。
感谢您的帮助。
更新05/09/2012
仍然不起作用。
更新26/08/2012
这将在Mongo命令行上返回结果:
db.foo.find( {   "submittalDate":{ "$gte": ISODate("2012-07-31T23:00:00.000Z")  }, "category" : "New"    } )

相比之下,Java代码(针对相同的日期参数)无法运行。为了比较,Java记录在DEBUG级别下的查询如下:

[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(..)。但是我正在使用MongoDB Java驱动程序,并且接受java.util.Date类型 - 为什么ISODate(..)没有出现会成为问题呢?问题可能有其他原因。


查询结构看起来对我来说是正确的。你能否在org.springframework.data.document.mongodb上启用DEBUG,以查看实际执行的查询? - Ajay George
谢谢,我会尝试使用DEBUG来调试它...(我已经使用Eclipse进行了断点步进调试,看起来是合理的) - Smashing Turnip
2个回答

1
我不是Spring专家,但似乎你的一些导入可能会相互冲突。鉴于我查看的文档,很难确切地诊断出你错在哪里。如果你不想使用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(开头的那一行无法编译。 - Smashing Turnip

0
{ "$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 的一个 bug。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接