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

问题描述 投票:0回答:1

因此Criteria中有getCriteriaObject,它返回Document,然后您可以对文档进行一些操作,但是随后我想通过转换回Criteria来使用结果,我无法真的找不到方法。

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

mongodb spring-boot spring-data-mongodb
1个回答
0
投票
简短的回答:否

Criteria具有Querydsl -like语法,它允许生成

type-safe查询。从Document读取可能会为当前的MongoDB版本引入MongoDB不兼容的命令或语法

长答案:是

我们可以用Java reflection实现

walkaround,以将文档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"));

© www.soinside.com 2019 - 2024. All rights reserved.