Spring Data Mongo db从文档转换为条件

时间:2020-02-28 15:41:43

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

因此,从Criteria开始,我们有getCriteriaObject返回Document,然后您可以对文档进行一些操作,但是我想通过将结果转换回Criteria,我真的找不到方法。

我们当然要考虑具有多个运算符等的复杂Criteria。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

简短回答:否

Criteria具有类似Querydsl的语法,该语法允许生成类型安全查询。从Document读取可能会为当前的MongoDB版本引入 MongoDB不兼容的命令或语法

长答案:是

我们可以使用Java reflection实施遍历,以将文档key:value添加到条件private字段中。
警告:您假设您的Document具有兼容的运算符和正确的语法。

将此辅助方法添加到您的班级(souce):

public static Criteria from(Document document) {
    Criteria c = new Criteria();

    try {

        Field _criteria = c.getClass().getDeclaredField("criteria");
        _criteria.setAccessible(true);

        @SuppressWarnings("unchecked")
        LinkedHashMap<String, Object> criteria = (LinkedHashMap<String, Object>) _criteria.get(c);

        for (Entry<String, Object> set : document.entrySet()) {
            criteria.put(set.getKey(), set.getValue());
        }

        Field _criteriaChain = c.getClass().getDeclaredField("criteriaChain");
        _criteriaChain.setAccessible(true);

        @SuppressWarnings("unchecked")
        List<Criteria> criteriaChain = (List<Criteria>) _criteriaChain.get(c);
        criteriaChain.add(c);

    } catch (Exception e) {
        // Ignore
    }

    return c;
}

现在从CriteriaDocument创建新实例:

Criteria newCriteria = from(criteria.getCriteriaObject());

//You have full-compatible Criteria instance
newCriteria.and("foobar").elemMatch(Criteria.where("field").is("value"));