Java MongoDB查询条件(WHERE日期> X和字段=值)忽略第二个子句

Sma*_*nip 5 java mongodb-java

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

顶级的Spring Java MongoDB查询返回了预期的结果q1s.

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

即它就像是and("category").is("New")从第二个查询被忽略.

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

帮助赞赏.

更新05/09/2012

仍然无法正常工作

更新26/08/2012

这将返回Mongo命令行上的结果:

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

相反,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"} 
Run Code Online (Sandbox Code Playgroud)

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

小智 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); 

}

}
Run Code Online (Sandbox Code Playgroud)