Spring 数据 MongoDB 无法加载引用集合 (@DBRef)

Spring Data MongoDB not able to load reference collection (@DBRef)

我在 mongo 数据库中有两个集合,名为 failurecausesstatistics。 每个统计都有一个失败原因列表的引用。

我有另一个 Spring 引导应用程序 spring-boot-starter-data-MongoDB 我正在尝试加载统计数据。

在这里我可以找到统计元素,但引用失败原因未加载。

有人能帮帮我吗。

统计集合条目

{
    "_id" : ObjectId("5de64e537c31473444743985"),
    "projectName" : "Test",
    "buildNumber" : 5,
    "displayName" : "#5",
    "result" : "FAILURE",
    "failureCauses" : [ 
        {
            "failureCause" : {
                "$ref" : "failureCauses",
                "$id" : ObjectId("5ddcf6f98f705f000623ec39"),
                "$db" : "bfa_test"
            },
            "indications" : [ 
                {,
                    "matchingFile" : "log",
                    "matchingString" : "ERROR:"
                }
            ]
        }
    ]
} 

FailureCauses 集合条目

{
    "_id" : ObjectId("5c99cfcfffb7870007bb351b"),
    "name" : " failed",
    "description" : "check build log.",
    "comment" : "",
    "indications" : [ 
        {
            "@class" : "com.sonyericsson.jenkins.plugins.bfa.model.indication.BuildLogIndication",
            "pattern" : "Execution  failed\."
        }
    ],
    "modifications" : [ 
        {
            "user" : "abcv",
            "time" : ISODate("2019-03-26T07:07:59.872Z")
        }
    ],
    "lastOccurred" : ISODate("2019-09-16T05:38:45.623Z")
}

Spring StaticsRepository

public interface StatisticsRepository extends MongoRepository<Statistic, String> {

    Collection<Statistic> findByProjectNameAndBuildNumber(String projectName,
            Integer buildNumber);
}



@Document(value = "statistics")
public class Statistic implements Serializable {
    @Id
    private String id;
    private String projectName;
    private String buildNumber;
    private String master;
    private Long duration;
    private String result;
    @DBRef
    private List<FailureCause> failureCauses;
}


@Document(value = "failureCauses")
public class FailureCause implements Serializable {
    @Id
    private String id;
    private String name;
    private String description;
    private String comment;
    private Date lastOccurred;
    private List<String> categories;
    private List<Indication> indications;
    private List<FailureCauseModification> modifications;
}

查询统计信息的输出

[
    {
        "id": "5de64e537c31473444743985",
        "projectName": "Test",
        "buildNumber": "5",
        "master": null,
        "duration": 490,
        "result": "FAILURE",
        "failureCauses": [
             {
                "id": null,
                "name": null,
                "description": null,
                "comment": null,
                "lastOccurred": null,
                "categories": null,
                "indications": [
                    {
                        "pattern": ".*some error.*",
                        "matchingString": "some error"
                    }
                ],
                "modifications": null
            }
        ]
    }
]

根据集合 statistic 的记录,@Query 参数应修改如下:

public interface StatisticsRepository extends MongoRepository<Statistic, String> {

@Query("{'projectName' : ?0 , 'buildNumber' : ?1 }")
Collection<Statistic> findByProjectNameAndBuildNumber(String projectName,
        Integer buildNumber);
}

因为这两个字段在集合中处于顶层statistic。不是作为子文档 failureCauses 中的字段。

重构模型 类 解决了问题,

下面是映射 mongo 数据库统计信息收集模式的正确模型

故障原因模型

@Document(value = "failureCauses")
public class FailureCause implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    /**
     * @param id            the id.
     * @param name          the name of this FailureCause.
     * @param description   the description of this FailureCause.
     * @param comment       the comment of this FailureCause.
     * @param lastOccurred  the time at which this FailureCause last occurred.
     * @param categories    the categories of this FailureCause.
     * @param indications   the list of indications
     * @param modifications the modification history of this FailureCause.
     */
    @Id
    private String id;
    private String name;
    private String description;
    private String comment;
    private Date lastOccurred;
    private List<String> categories;
    private List<Indication> indications;
    private List<FailureCauseModification> modifications;
}

统计模型

@Document(value = "statistics")
public class Statistic implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Id
    private String id;
    private String projectName;
    private String buildNumber;
    private String master;
    private Long duration;
    private String result;
    private List<FailureCauses> failureCauses;
}

故障原因模型

public class FailureCauses implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @DBRef
    FailureCause failureCause;

    /**
     * @return the failureCause
     */
    public FailureCause getFailureCause()
    {
        return failureCause;
    }

    /**
     * @param failureCause the failureCause to set
     */
    public void setFailureCause(FailureCause failureCause)
    {
        this.failureCause = failureCause;
    }

}