使用spring-data-mongodb-1.5.4
和mongodb-driver-3.4.2
我有一个班级Hotel
public class Hotel {
private String name;
private int pricePerNight;
private Address address;
private List<Review> reviews;
//getter, setter, default constructor, parameterized constructor
Review
上课:
public class Review {
private int rating;
private String description;
private User user;
private boolean isApproved;
//getter, setter, default constructor, parameterized constructor
当我呼叫Aggregation.unwind("reviews");
时,它会抛出
org.springframework.data.mapping.model.MappingInstantiationException: 无法使用构造函数NO_CONSTRUCTOR实例化java.util.List 带参数
UnwindOperation unwindOperation = Aggregation.unwind("reviews");
Aggregation aggregation = Aggregation.newAggregation(unwindOperation);
AggregationResults<Hotel> results=mongoOperations.aggregate(aggregation,"hotel", Hotel.class);
我看到this question但不帮助我。
如何解决这个问题?
答案 0 :(得分:5)
当您$unwind
reviews
字段时,查询的返回json结构不再与您的Hotel
类匹配。因为$unwind
操作使reviews
成为子对象而不是列表。如果您在robomongo或其他工具中尝试查询,则可以看到您的返回对象就是那样
{
"_id" : ObjectId("59b519d72f9e340bcc830cb3"),
"id" : "59b23c39c70ff63135f76b14",
"name" : "Signature",
"reviews" : {
"id" : 1,
"userName" : "Salman",
"rating" : 8,
"approved" : true
}
}
所以你应该使用另一个类而不是像Hotel
UnwindedHotel
public class UnwindedHotel {
private String name;
private int pricePerNight;
private Address address;
private Review reviews;
}
UnwindOperation unwindOperation = Aggregation.unwind("reviews");
Aggregation aggregation = Aggregation.newAggregation(unwindOperation);
AggregationResults<UnwindedHotel> results=mongoOperations.aggregate(aggregation,"hotel", UnwindedHotel.class);
答案 1 :(得分:0)
我遇到了这个问题,我在展开后使用“项目”管道解决了这个问题。 在春季启动聚合中会发生这种情况,但是在mongo shell中,展开后不需要项目
答案 2 :(得分:0)
一天前我突然想到一个非常不同的问题,让我发疯了很长时间,我认为在这里分享可能非常有用,即使它不是关于放松:
{"header":{"key":"first", "value": 4}}
{"header":[{"key":"first", "value": 4}] }
当我只处理新文档时,一切都运行良好,但是在进行更一般的测试时,我不断因有关 List 的 mongodb 错误而崩溃,因为在我的数据库中,我有没有列表的旧文档,但我忘记删除简单的对象并且与想要列表的新模型相冲突。
让我清理数据库并从头开始测试很简单。