MongoError:Spring Boot抛出E11000重复键错误

时间:2020-04-26 18:15:28

标签: java spring mongodb spring-boot

我一直在尝试使用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

1 个答案:

答案 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.apcMOVAVI的2个不同值。由于使用唯一选项为该索引编制了索引,因此该集合中的任何其他文档在该字段中都不能具有这些值之一。