有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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(…)这不是问题吗?这个问题可能还有另一个原因


共 (2) 个答案

  1. # 1 楼答案

    { "$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的一个错误

  2. # 2 楼答案

    我不是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); 
    
    }
    
    }