当前位置: 首页 > 知识库问答 >
问题:

聚合结果无法正确映射到Java对象

司徒博容
2023-03-14
db.theaters.aggregate([
    { $match: { 'city_id': <someCityId>, 'theatreRooms.schedules.spectacle_id': <someSpecId> } }, 
    { $unwind: '$theatreRooms' },
    { $unwind: '$theatreRooms.schedules' },
    { $group: { _id: { name: '$name', room: '$theatreRooms.name' }, schedules: { $addToSet: '$theatreRooms.schedules.time' } } },
    { $group: { _id: '$_id.name', schedules: { $addToSet: { room: '$_id.room', schedules: '$schedules' } } } }
])

public class TheaterProject {

    private TheaterId _id;
    private List<String> schedules;

    public TheaterId get_id() {
        return _id;
    }

    public void set_id(TheaterId _id) {
        this._id = _id;
    }

    public List<String> getSchedules() {
        return schedules;
    }

    public void setSchedules(List<String> schedules) {
        this.schedules = schedules;
    }
}
public class TheaterId {

    @Field("name")
    private String name;

    @Field("room")
    private Integer room;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getRoom() {
        return room;
    }

    public void setRoom(Integer room) {
        this.room = room;
    }
}

public Document  getRawSchedules(String cityId, String spectaclesId){
        MatchOperation match = Aggregation.match(Criteria.where("city_id").is(cityId).and("theatreRooms.schedules.spectacle_id").is(spectaclesId));
        UnwindOperation theaterUnwind = Aggregation.unwind("theatreRooms");
        UnwindOperation schedulesUnwind = Aggregation.unwind("theatreRooms.schedules");

        GroupOperation firstGroup = Aggregation.group(Fields.from(
                Fields.field("name", "name"),
                Fields.field("room", "theatreRooms.name")))
                .addToSet("theatreRooms.schedules.time").as("schedules");

        Aggregation agg = Aggregation.newAggregation(match,theaterUnwind,schedulesUnwind,firstGroup);
        Document theaters = mongoTemplate.aggregate(agg, Theater.class, TheaterProject.class).getRawResults();
        return theaters;
    }
public List<TheaterProject>  getSchedules(String cityId, String spectaclesId){
        MatchOperation match = Aggregation.match(Criteria.where("city_id").is(cityId).and("theatreRooms.schedules.spectacle_id").is(spectaclesId));
        UnwindOperation theaterUnwind = Aggregation.unwind("theatreRooms");
        UnwindOperation schedulesUnwind = Aggregation.unwind("theatreRooms.schedules");

        GroupOperation firstGroup = Aggregation.group(Fields.from(
                Fields.field("name", "name"),
                Fields.field("room", "theatreRooms.name")))
                .addToSet("theatreRooms.schedules.time").as("schedules");

        Aggregation agg = Aggregation.newAggregation(match,theaterUnwind,schedulesUnwind,firstGroup);

        List<TheaterProject> theaters = mongoTemplate.aggregate(agg, Theater.class, TheaterProject.class).getMappedResults();
        return theaters;
    }
[
    {
        "_id": null,
        "schedules": [
            "5:15"
        ]
    },
    {
        "_id": null,
        "schedules": [
            "6:55",
            "4:35",
            "10:15"
        ]
    }
]
{
    "results": [
        {
            "_id": {
                "name": "Pinokio",
                "room": 2
            },
            "schedules": [
                "5:15"
            ]
        },
        {
            "_id": {
                "name": "Roma",
                "room": 1
            },
            "schedules": [
                "6:55",
                "4:35",
                "10:15"
            ]
        }
    ]
}

共有1个答案

壤驷高旻
2023-03-14

我在文档和这里没有找到任何关于这个问题的信息。但我有办法。您可以将字段从_id重命名为其他字段。例如,theaterid。我不知道您的问题的所有要求,但您可以做它只是在映射级别。

修复映射

import org.springframework.data.mongodb.core.mapping.Field;

import java.util.List;

public class TheaterProject {

    @Field("theaterId")
    private TheaterId _id;
    private List<String> schedules;

    public TheaterId get_id() {
        return _id;
    }

    public void set_id(TheaterId _id) {
        this._id = _id;
    }

    public List<String> getSchedules() {
        return schedules;
    }

    public void setSchedules(List<String> schedules) {
        this.schedules = schedules;
    }
}

但它需要额外的投影步骤

public List<TheaterProject>  getSchedules(String cityId, String spectaclesId){
    ...

    GroupOperation firstGroup = Aggregation.group(Fields.from(
                Fields.field("name", "name"),
                Fields.field("room", "theatreRooms.name")))
                .addToSet("theatreRooms.schedules.time").as("schedules");

    ProjectionOperation projection = Aggregation.project(Fields.from(
                Fields.field("theaterId", "_id"),
                Fields.field("schedules", "schedules")));

    Aggregation agg = Aggregation.newAggregation( ... ,firstGroup, projection);

    List<TheaterProject> theaters = mongoTemplate.aggregate(agg, "collectionName", TheaterProject.class).getMappedResults();
    return theaters;
}
 类似资料:
  • 问题内容: 我正在尝试设置控制器,但是很遗憾无法查看输出…一切都正确呈现。当我转到404页面时。从Netbeans运行我的应用程序转到 app-config.xml web.xml 我如何调试它,看看有什么用,什么没用? 更新资料 Netbeans中的GlassFish服务器日志显示 问题答案: 您的名字映射到中吗?从您先前的问题中,我看到: 网址不匹配格式。尝试一种可能的解决方法。

  • 我有一个用户类,有16个属性,比如名字,姓氏,出生日期,用户名,密码等...这些都存储在MySQL数据库中,当我想要检索用户时,我使用ResultSet。我想将每一列映射回用户属性,但我这样做的效率似乎非常低。例如,我正在做: 也就是说,我检索所有的列,然后通过将所有的列值插入用户构造函数来创建用户对象。 有人知道更快、更整洁的方法吗?

  • 在对这个话题进行了大量的测试和研究之后,我无法完全解决我的问题。我正在springboot应用程序中使用modelmapper进行实体/DTO映射。我正在尝试配置modelmapper,将一个集合映射到一个简单的DTO对象。我已经创建了一个自定义转换器,它正在按预期工作: 我现在的问题是将此转换器应用于所有“集合”= 如果我直接在模型映射器中添加转换器,它就是不工作。 你对此有什么提示或解决办法吗

  • 因此,我试图找出每个月(本例中为6月至7月)销售额变化最大的客户。 以下是我为了这个实践而创建的模型数据: 根据以上两个表,答案应该是CustomerID为10的客户,1998年6月至7月销售额增加350.28。 下面是我实现目标的代码;基本上,我创建了两个视图,一个是每年每个客户6月份的销售额总和,另一个是每年每个客户7月份的销售额总和,然后从7月份的销售额中减去6月份的销售额: 但是,我的输出

  • 我使用http://jsonlint.com来验证JSON是否有效。因此,我要么需要更改JSON或代码,要么可能两者都需要。有什么想法吗?

  • 我有麻烦映射一个嵌套dto字段正确与MapStruct。我有几个DTO: 具有相应的映射器 到目前为止,一切工作都很好,生成的代码自动连接其他需要的映射器来正确地构建DTO。例如生成的仪器映射器实现 现在,当我试图创建一个包含嵌套工具dto的映射器时遇到了麻烦。映射器应使用instrumentMapper正确创建所需的dto。DTO: 映射器: 生成的代码: 现在media mapper得到了很好