【问题标题】:MongoTemplate Criteria QueryMongoTemplate 标准查询
【发布时间】:2015-11-05 14:03:22
【问题描述】:

我正在根据多个参数生成一个复杂的Mongo 查询。我想用Criteria 助手类制定的标准之一是:

{"field1": {$exists: true, $ne: false}}

我试着用:

Criteria.where("field1").is(Criteria.where("$ne").is(false).and("$exists").is(true))

但它会生成:

{ "field1" : { $java : org.springframework.data.mongodb.core.query.Criteria@23864e60 } 

那么,如何实现我需要的确切查询? 我无法对该查询字符串进行硬编码,因为这些类型标准是为 field1,...fieldN 动态生成的,然后与 $or 结合使用:

statusCriteria = statusCriteria.orOperator(criterias.toArray(new Criteria[criterias.size()]));

【问题讨论】:

    标签: java mongodb spring-data-mongodb mongotemplate


    【解决方案1】:

    由于您不能使用Criteria.and() 将多个条件添加到同一字段中,请使用Criteria.andOperator(),如下所示:

    Query query = new Query();
    query.addCriteria(
        new Criteria().andOperator(
            Criteria.where("field1").exists(true),
            Criteria.where("field1").ne(false)
        )
    );
    
    List<Foo> result = mongoTemplate.find(query, Foo.class);
    System.out.println("query - " + query.toString());
    
    for (Foo foo : result) {
        System.out.println("result - " + foo);
    }
    

    【讨论】:

    • 生成以下块 { "$and" : [ { "field" : { "$exists" : true}} , { "field" : { "$ne" : false}}]}这不完全是我需要的,但从逻辑上讲是这样。不会因为“字段”加倍而导致性能问题吗?
    • @Aeteros 完全没有性能问题。从 docs 开始,MongoDB 在指定逗号分隔的表达式列表时提供了隐式的 AND 操作。当必须在多个表达式中指定相同的字段或运算符时,必须使用显式的 AND$and 运算符。
    • @chridam - 非常感谢。您的解决方案完美运行。 Gr8 工作!!
    【解决方案2】:
    Query query = new Query(Criteria.where("field1").exists(true).ne(false));
    

    或者,如果 field1 在存在时始终是布尔值:

    Query query = new Query(Criteria.where("field1").is(true));
    

    【讨论】:

      猜你喜欢
      • 2012-12-28
      • 1970-01-01
      • 1970-01-01
      • 2015-03-28
      • 2019-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多