【问题标题】:Build dynamic queries with Spring Data MongoDB Criteria使用 Spring Data MongoDB Criteria 构建动态查询
【发布时间】:2014-08-25 02:17:41
【问题描述】:

我想对用户在 UI 中选择的 MongoDB 中的文档列表运行批量删除操作,因此我需要动态构建一个如下所示的查询(or 子句针对每个文档展开选择):

{
    $and: [
        {
            "contentType": "application/vnd.sometype"
        },
        {
            $or: [
                {
                    "metadata.name": "someName",
                    "metadata.version": "someVersion"
                },
                {
                    "metadata.name": "someOtherName",
                    "metadata.version": "someOtherVersion"
                }
            ]
        }
    ]
},
Fields: null,
Sort: null

刚才我正在使用字符串连接来实现这一点。

是否可以使用 Spring Data MongoDB Criteria Builder (org.springframework.data.mongodb.core.query.Criteria) 构建此查询?

【问题讨论】:

    标签: spring mongodb spring-data spring-data-mongodb


    【解决方案1】:

    在这里,我们需要构建新查询并将条件嵌入到构建的新查询中。而且,我们必须使用一些标准来创建一个标准列表,以便嵌入到查询中。这里我的示例是提供元数据列表,我们不知道将为我们发送的参数名称。所以,解决方案如下。

    List<Criteria> criterias = new ArrayList<>();
    
        for (MetaData metaData : newDoc.getMetaData()) {
            Criteria dynamicCriteria = Criteria.where("metaData.key").is(metaData.getKey()).andOperator(Criteria.where("metaData.value").is(metaData.getValue()));
            criterias.add(dynamicCriteria);
        }
    
        Criteria criteria = new Criteria().andOperator(criterias.toArray(new Criteria[criterias.size()]));
    
        Query searchQuery = new Query(criteria);
    
        List<Document> documents = mongoTemplate.find(searchQuery, Document.class);
    

    【讨论】:

      【解决方案2】:

      这不适合你吗?

      Criteria criteria = Criteria.where("contentType").is("application/vnd.sometype");
      
      List<Criteria> docCriterias = new ArrayList<Criteria>(docs.size());
      
      for (Document doc: docs) {
          docCriterias.add(Criteria.where("metadata.name").is(doc.getName())
                                     .and("metadata.version").is(doc.getVersion()));
      }
      
      criteria = criteria.orOperator(docCriterias.toArray(new Criteria[docs.size()]));
      

      ?

      【讨论】:

      • @Artem Bilan criteria.orOperator(docCriterias.toArray(new Criteria[docs.size()]));我在将我的 Criteria 列表转换为 Array 时遇到问题,它一直说 orOperator 没有为 Criteria [] 定义?你能帮忙吗?
      • 请检查您的 Spring Data MongoDB 版本。尝试使用最新的。
      • 我使用的是 1.5.0.RELEASE
      • 它一直在说 Criteria 类型中的方法 orOperator(Criteria...) 不适用于参数 (Criteria[])
      • 你不会误用org.hibernate.Criteria吗?
      猜你喜欢
      • 2018-11-25
      • 2022-08-14
      • 2017-07-20
      • 2019-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-11
      • 1970-01-01
      相关资源
      最近更新 更多