Java 如何从AggregationOutput映射到POJO?

Java 如何从AggregationOutput映射到POJO?,java,mongodb,aggregation-framework,mongodb-java,Java,Mongodb,Aggregation Framework,Mongodb Java,对于一个复杂的查询,我使用MongoDB Java API(我的大部分内容都使用Spring数据),并使用BasicDBObject编写了一个聚合语句 DBCollection users = mongoOperations.getCollection("users"); AggregationOutput aggregationOutput = users.aggregate( new BasicDBObject("$match", new BasicDBOb

对于一个复杂的查询,我使用MongoDB Java API(我的大部分内容都使用Spring数据),并使用BasicDBObject编写了一个聚合语句

DBCollection users = mongoOperations.getCollection("users");

    AggregationOutput aggregationOutput = users.aggregate(
            new BasicDBObject("$match", new BasicDBObject("_id", userId)),
            new BasicDBObject("$project", new BasicDBObject("userProfile.vitals", 1)),
            new BasicDBObject("$unwind", "$userProfile.vitals"),
            new BasicDBObject("$match", new BasicDBObject("userProfile.vitals.type", type.name())),
            new BasicDBObject("$sort", new BasicDBObject("userProfile.vitals.observationDate", -1)),
            new BasicDBObject("$limit", 1)
    );
此查询有效,我的问题与此语句无关

这个聚合的结果仍然非常适合我的POJO(聚合中没有$group)

如果我使用CriteriaAPI进行查询,我会得到一个用户对象。在AggregationOutput#results()中,我有一个DBObject

有没有一种方法可以调用内部用于将DBObject直接转换为我的POJO的转换器

我试过了

mongoTemplate.getConverter().read(User.class,result);
但这引发了一个异常,即它无法实例化java.util.List。这很有意义,因为这是一个接口

有什么想法吗

谢谢大家!


Kristof.

我建议使用一个单独的类(AggregatedUser.class),您可以直接映射输出结果,而不是用户POJO映射

我这样做有几个原因:

  • 建造它很容易
  • 不要丢弃聚合输出中将来可能有用的元信息
  • 一旦开始使用
    $project
    ,您将需要它
关于执行此操作的弹簧适配器,我不知道这是可能的。不过我可能错了

N.

来自

$unwind为展开数组的每个成员返回一个文档 在每个源文档中

你写道:

这种聚合的结果仍然是完美契合的 在我的POJO中(聚合中没有$group)

这是一个错误的假设!展开会影响返回文档的结构,并且POJO不再适合结果

在本例中,您正在展开“关键点”阵列。返回的文件不包含生命体征列表。相反,每个用户文档都有一个vitals对象。这种结构差异导致映射器失败,因为它需要一个重要对象列表,但却得到了一个重要对象