使用Spring Data MongoDB Criteria构建动态查询

时间:2014-07-03 20:07:17

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

我想在用户在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)构建此查询?

2 个答案:

答案 0 :(得分:10)

这不适合你吗?

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()]));

答案 1 :(得分: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);