我在上面给出的存储库中有上述错误
@Repository("polygonQueryRepository")
@RequiredArgsConstructor
public class PolygonQueryRepositoryImpl extends PolygonRepository {
@Autowired
private MongoOperations operations;
public List<DBObject> findPolygonsMatchingGivenPointAndInputAggregate(Double lat, Double lng, String band) {
GeoJsonPoint point = new GeoJsonPoint(lat, lng);
MatchOperation operation = match(Criteria.where("location").intersects(point).and("attributes.band").regex(band));
Aggregation aggregation = newAggregation(Polygon.class,
unwind("attributes.transponders"),
operation);
AggregationResults<DBObject> result =
operations.aggregate(aggregation,"Polygon",DBObject.class);
return result.getMappedResults();
}
}
我之前读过我在定义MongoTemplate bean时需要注册编解码器。所以我做了 - 但仍然没有运气。
@Configuration
public class SpringMongoConfig {
@Value("${mongo.db.name}")
private String dbName;
@Value("${mongo.db.host}")
private String dbHost;
@Bean
public MongoDbFactory mongoDbFactory() throws Exception {
MongoClientOptions options = MongoClientOptions.builder().codecRegistry(MongoClient.getDefaultCodecRegistry()).build();
return new SimpleMongoDbFactory(new MongoClient(dbHost,options), dbName);
}
@Bean
public MongoTemplate mongoTemplate() throws Exception {
MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory());
return mongoTemplate;
}
}
你有什么建议吗?
答案 0 :(得分:0)
你接近这条线:
output.writeBytes(json.toString());
但要使用GeoJsonPoint类,您需要实现Codec接口,然后按以下方式注册:
MongoClientOptions options = MongoClientOptions
.builder()
.codecRegistry(MongoClient.getDefaultCodecRegistry())
.build();
您可以在选项构建器中使用此注册表。
答案 1 :(得分:0)
cbartosiak,非常感谢你的回答!这对我帮助很大。但是解决方法超级超级显而易见!:)
实际上注册表是必需的,但我无法注册UNTIL我将聚合接口更改为
AggregationResults<AggregatedPolygon> result = template.aggregate((TypedAggregation<?>) aggregation, AggregatedPolygon.class);
所以我只需要向TypedAggregation
aggregation
对象添加强制转换,并从界面中删除集合名称。
这真的很奇怪,但这样对我有用。