聚合的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 楼答案
请先尝试确定聚合是否有效,然后返回一个文档,而不是尝试映射到DTO
暂时不要使用doNext()。一步一步地接近它,找出它到底在哪里失败