Spring 数据 MongoDB 无法加载引用集合 (@DBRef)
Spring Data MongoDB not able to load reference collection (@DBRef)
我在 mongo 数据库中有两个集合,名为 failurecauses 和 statistics。
每个统计都有一个失败原因列表的引用。
我有另一个 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;
}
}
我在 mongo 数据库中有两个集合,名为 failurecauses 和 statistics。 每个统计都有一个失败原因列表的引用。
我有另一个 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;
}
}