我一直在尝试使用Spring Boot创建一个MongoDB应用程序。但是,在启动之前,它将引发E11000 Dup异常。集合中的关键错误。尽管我已经验证了所有要点,但是在启动时会发生此错误,但是我没有在数据中找到任何重复的密钥。 我的数据结构看起来像
@Document( collection = "IT" )
public class ItemType {
@Id
private String id;
private IV[] iv;
}
public class IV {
private String value;
private AP[] aps;
}
@Document( collection = "AP" )
public class AP {
@Id
private String id;
@Indexed( unique = true )
private String apc;
private String dim;
private string foc;
}
每当我启动spring boot应用程序时,它都会引发以下异常:
E11000重复密钥错误集合: p.IT 索引: iv.aps.apc dup密钥: {:“ AVI”}
我的数据集是:
{
"_id" : ObjectId("5e846c5c3584fe7c7831283e"),
"iv" : [
{
"value" : "M",
"aps" : [
{
"apc" : "MOV"
},
{
"apc" : "AVI"
}
]
},
{
"value" : "N",
"aps" : [
{
"apc" : "MOV"
},
{
"apc" : "AVI"
}
]
},
{
"value" : "O",
"aps" : [
{
"apc" : "MOV"
}
]
},
{
"value" : "P",
"aps" : [
{
"apc" : "MOV"
}
]
}
]
}
我是MongoDB的新手,看来我没有正确建立数据结构。因为我愿意创建引用集合的方式,所以我只能在另一个集合中使用的几个属性在那里可用,即您可以看到 AP 具有2个以上的属性。但是,我仅使用 IV
所需的 apc答案 0 :(得分:0)
您在AP类中定义了唯一索引
@Indexed( unique = true )
private String apc;
然后在IV类中有一个AP对象数组
private AP[] aps;
和IT类中的一系列IV对象
private IV[] iv;
结果索引将强制2个文档不能包含具有相同值的apc
字段。 MongoDB中的索引被构造为一组k
-> v
对,其中k
是值索引字段,而v
是内部文档标识符(不是_id)。如果同一值在单个文档中多次出现,则仅将其添加到索引一次。
唯一属性是在索引级别强制执行的,因此单个文档可以重复该值,因为它将仅导致索引中的单个条目,但是其他文档则不能使用该值,因为它将需要添加索引中的第二个副本。
为将其重新带到您的数据中,该示例文档包含iv.aps.apc
,MOV
和AVI
的2个不同值。由于使用唯一选项为该索引编制了索引,因此该集合中的任何其他文档在该字段中都不能具有这些值之一。