Spring Mongo 聚合给出转换错误
Spring Mongo Aggregation give a conversion error
我正在尝试使用 Mongo 聚合,但我收到一个我不理解的错误。
这是我的域名:
@Document(collection = "tapes")
public class Tape {
@Id
private String id;
private String area;
private Integer tape;
private String tapeModel;
// follow getters e setters
mongoshell命令,输出如下:
> db.tapes.aggregate([{ $group: { _id: { "area":"$area"}, tapes: {$push: {tape: "$tape"}}}} ])
{ "_id" : { "area" : "free" }, "tapes" : [ { "tape" : 1 }, { "tape" : 2 } ] }
{ "_id" : { "area" : "Qnap" }, "tapes" : [ { "tape" : 3 } ] }
以下是在 Spring 中重新创建聚合的尝试:
AggregationOperation group = Aggregation.group("area").push("tape").as("tape");
Aggregation aggregation = Aggregation.newAggregation(group);
AggregationResults<Tape> results = mongoTemplate.aggregate(aggregation, "tapes", Tape.class);
//List<Tape> tapes = mongoTemplate.aggregate(aggregation, mongoTemplate.getCollectionName(Tape.class), Tape.class).getMappedResults();
List<Tape> tapes = results.getMappedResults();
System.out.println(tapes);
但是我得到以下错误:
Cannot convert [3] of type class java.util.ArrayList into an instance of class java.lang.Integer! Implement a custom Converter<class java.util.ArrayList, class java.lang.Integer> and register it with the CustomConversions. Parent object was: it.unifi.cerm.cermadminspring.domain.Tape@2b84da07 -> null
org.springframework.data.mapping.MappingException: Cannot convert [3] of type class java.util.ArrayList into an instance of class java.lang.Integer! Implement a custom Converter<class java.util.ArrayList, class java.lang.Integer> and register it with the CustomConversions. Parent object was: it.unifi.cerm.cermadminspring.domain.Tape@2b84da07 -> null
我不明白为什么,我搜索了聚合示例,都或多或少与我的相似。
有人可以帮助我吗?
首先,为了让生活更轻松,可以使用更简化的聚合:
> db.tapes.aggregate([ {$group: {_id: "$area", tapes: {$push: "$tape"}}} ])
哪个应该产生:
{ "_id" : "free", "tapes" : [ 1 , 2 ] }
{ "_id" : "Qnap", "tapes" : [ 3 ] }
这应该通过更改 Java group
聚合操作来匹配:
AggregationOperation group = Aggregation.group("area").push("tape").as("tapes");
请注意,我已更改为复数形式:as("tapes")
然后,请注意您实际上 return 正在创建一个文档,该文档的结构与您在 Tape
class 中映射的文档不同。该文档包含两个字段,String
id
和 List<Integer>
tapes
字段。
这就是我在上面建议的 shorthand group
聚合的原因,使映射更容易:
public class TapesForArea {
private String id; // which is the area
private List<Integer> tapes;
// getters, setters ...
}
您不需要使用 spring-data-mongodb
注释映射此 class。
最后,聚合结果 return 正确的类型:
AggregationResults<TapesForArea> results =
mongoTemplate.aggregate(aggregation, "tapes", TapesForArea.class);
List<TapesForArea> tapes = results.getMappedResults();
顺便说一句,错误来自于您尝试将单个项目 tape
数组 [ 3 ]
映射到 private Integer tape;
属性 of Tape
class.
我正在尝试使用 Mongo 聚合,但我收到一个我不理解的错误。
这是我的域名:
@Document(collection = "tapes")
public class Tape {
@Id
private String id;
private String area;
private Integer tape;
private String tapeModel;
// follow getters e setters
mongoshell命令,输出如下:
> db.tapes.aggregate([{ $group: { _id: { "area":"$area"}, tapes: {$push: {tape: "$tape"}}}} ])
{ "_id" : { "area" : "free" }, "tapes" : [ { "tape" : 1 }, { "tape" : 2 } ] }
{ "_id" : { "area" : "Qnap" }, "tapes" : [ { "tape" : 3 } ] }
以下是在 Spring 中重新创建聚合的尝试:
AggregationOperation group = Aggregation.group("area").push("tape").as("tape");
Aggregation aggregation = Aggregation.newAggregation(group);
AggregationResults<Tape> results = mongoTemplate.aggregate(aggregation, "tapes", Tape.class);
//List<Tape> tapes = mongoTemplate.aggregate(aggregation, mongoTemplate.getCollectionName(Tape.class), Tape.class).getMappedResults();
List<Tape> tapes = results.getMappedResults();
System.out.println(tapes);
但是我得到以下错误:
Cannot convert [3] of type class java.util.ArrayList into an instance of class java.lang.Integer! Implement a custom Converter<class java.util.ArrayList, class java.lang.Integer> and register it with the CustomConversions. Parent object was: it.unifi.cerm.cermadminspring.domain.Tape@2b84da07 -> null
org.springframework.data.mapping.MappingException: Cannot convert [3] of type class java.util.ArrayList into an instance of class java.lang.Integer! Implement a custom Converter<class java.util.ArrayList, class java.lang.Integer> and register it with the CustomConversions. Parent object was: it.unifi.cerm.cermadminspring.domain.Tape@2b84da07 -> null
我不明白为什么,我搜索了聚合示例,都或多或少与我的相似。
有人可以帮助我吗?
首先,为了让生活更轻松,可以使用更简化的聚合:
> db.tapes.aggregate([ {$group: {_id: "$area", tapes: {$push: "$tape"}}} ])
哪个应该产生:
{ "_id" : "free", "tapes" : [ 1 , 2 ] }
{ "_id" : "Qnap", "tapes" : [ 3 ] }
这应该通过更改 Java group
聚合操作来匹配:
AggregationOperation group = Aggregation.group("area").push("tape").as("tapes");
请注意,我已更改为复数形式:as("tapes")
然后,请注意您实际上 return 正在创建一个文档,该文档的结构与您在 Tape
class 中映射的文档不同。该文档包含两个字段,String
id
和 List<Integer>
tapes
字段。
这就是我在上面建议的 shorthand group
聚合的原因,使映射更容易:
public class TapesForArea {
private String id; // which is the area
private List<Integer> tapes;
// getters, setters ...
}
您不需要使用 spring-data-mongodb
注释映射此 class。
最后,聚合结果 return 正确的类型:
AggregationResults<TapesForArea> results =
mongoTemplate.aggregate(aggregation, "tapes", TapesForArea.class);
List<TapesForArea> tapes = results.getMappedResults();
顺便说一句,错误来自于您尝试将单个项目 tape
数组 [ 3 ]
映射到 private Integer tape;
属性 of Tape
class.