Java MongoDB查询条件(其中日期>X,字段=值)忽略第二个子句
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);
}
}
top Spring Java MongoDB查询返回q1s
中的预期结果
底部查询应返回顶部查询的子集。相反,与("submittalDate").gt(submittalDate)
匹配的记录在q2s
结果中,而不管它们是否在“新”类别中
也就是说,第二个查询中的and("category").is("New")
被忽略
使用Mongodb版本v2。0.6 32位,带弹簧数据
谢谢你的帮助
更新日期:2012年9月5日
还是不行
更新日期:26/08/2012
这将在Mongo命令行上返回结果:
db.foo.find( { "submittalDate":{ "$gte": ISODate("2012-07-31T23:00:00.000Z") }, "category" : "New" } )
相反,Java代码(对于相同的日期参数)不起作用。为了进行比较,DEBUG from Java记录的查询为:
[DEBUG] [http-8080-1] (MongoTemplate.java:doFind:1256) find using query:
{ "submittalDate" : { "$gte" : { "$date" : "2012-07-31T23:00:00.000Z"}} , "category" : "New"}
是的,日志记录了一个日期字符串,而要让MongoShell工作,我需要使用ISODate(..)。 但我使用的是MongoDB Java驱动程序和公认的Java类型。util。日期-如何进行ISODate(…)这不是问题吗?这个问题可能还有另一个原因
# 1 楼答案
等于
并且
Date("2012-07-31T23:00:00.000Z")
将返回一个字符串,而不是ISODate()通过http://www.mongodb.org/display/DOCS/Mongo+Extended+JSON
我认为这是
org.springframework.data.mongodb.core.query.Criteria
的一个错误# 2 楼答案
我不是spring专家,但似乎你们的一些进口产品可能相互冲突。考虑到我看过的文档,很难准确地诊断出哪里出了问题。如果您不打算使用spring框架来实现这一点,下面是一种替代/更常见的方法