有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

聚合的java Spring数据MongoDB输出类型未与自定义ReactiveMongoTemplate映射

我正在尝试将聚合操作的结果映射到DTO。 它没有正确映射,并且没有错误或日志消息来指示出错的地方

db.barProperty.aggregate([
{
$match: { domainObjectId : "044f4c4c-d481-4461-ae2f-301c78ff5c91"}
},
{
$sort: {
priority: 1,
issuedAt: -1
}
},
{
$group: {
"_id": "$field",
"value": {"$last": "$value"},
"issuedAt": {"$last": "$issuedAt"}
}
}
], { allowDiskUse: true });

输出:

/* 1 */
{
    "_id" : "field1",
    "value" : "2021-04-05T12:15:00Z",
    "issuedAt" : ISODate("2021-06-14T00:10:00.000Z")
}

/* 2 */
{
    "_id" : "field2",
    "value" : "value2",
    "issuedAt" : ISODate("2021-06-14T00:10:00.000Z")
}

Java代码:

    return reactiveMongoQueryTemplate.aggregate(Aggregation.newAggregation(BarProperty.class,
                    Aggregation.match(Criteria.where("domainObjectId").is(domainObjectId)),
                    Aggregation.sort(Direction.DESC, PRIORITY)
                            .and(Direction.ASC, ISSUED_AT),
                    Aggregation.group("field")
                            .last(VALUE).as(VALUE)
                            .last(ISSUED_AT).as(ISSUED_AT)
            ).withOptions(AggregationOptions.builder().allowDiskUse(true).build()), ProjectionProperty.class)
            // TODO why is no ProjectionProperty being returned
            .doOnNext(c -> {
                System.out.println("found projection property");
            })
            .collectList();


@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ProjectionProperty {

    private String id;

    private String value;

    private OffsetDateTime issuedAt;
}

我已经试过了;和字段作为id字段的替代项

使用OOTB reactiveMongoTemplate编辑2021年10月5日,工作正常。 我已经配置了一个自定义池,因为我希望此聚合使用不同的池

@配置 类MultipleMongoConfig{

private final CustomMongoProperties customMongoProperties;

public MultipleMongoConfig(CustomMongoProperties customMongoProperties) {
    this.customMongoProperties = customMongoProperties;
}

@Bean
public MongoClient reactiveMongoQueryClient() {
    return MongoClients.create(createMongoClientSettings(customMongoProperties.getQuery()));
}

@Bean("mongoQueryTemplate")
public ReactiveMongoQueryTemplate reactiveMongoQueryTemplate() {
    return new ReactiveMongoQueryTemplate(reactiveMongoQueryClient(), customMongoProperties.getQuery().getDatabase());
}

private MongoClientSettings createMongoClientSettings(MongoProperties mongoProperties) {

    ConnectionString connectionString = new ConnectionString(mongoProperties.getUri());

    return MongoClientSettings.builder()
            .readConcern(ReadConcern.DEFAULT)
            .writeConcern(WriteConcern.MAJORITY)
            .readPreference(ReadPreference.primary())
            .applyConnectionString(connectionString)
            .build();
}

}

应用程序。亚马尔

spring:
  data:
    mongodb:
      database: @application.name@
      authenticationDatabase: admin
      uri: ${MONGO_URI}
      query:
        uri: ${MONGO_QUERY_URI}
        database: ${MONGO_QUERY_DB}
      auto-index-creation: true

共 (1) 个答案

  1. # 1 楼答案

    请先尝试确定聚合是否有效,然后返回一个文档,而不是尝试映射到DTO

    暂时不要使用doNext()。一步一步地接近它,找出它到底在哪里失败

    Flux<Document> result = reactiveMongoTemplate.aggregate(agg, BarProperty.class, Document.class);