有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java MongoError:Spring引导抛出E11000重复密钥错误

我一直在尝试使用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 duplicate key error collection: p.IT index: iv.aps.apc dup key: { : "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有两个以上的属性。但是,我只使用了IV所需的apc


共 (1) 个答案

  1. # 1 楼答案

    在AP类中定义了唯一索引

        @Indexed( unique = true )
        private String     apc;
    

    然后在第四类中有一个AP对象数组

    private AP[] aps;
    

    类中有一个IV对象数组

    private IV[] iv;
    

    生成的索引将强制要求任何两个文档都不能有具有相同值的apc字段。MongoDB中的索引结构为k->v对,其中k是值索引字段,v是内部文档标识符(而不是_id)。如果同一个值在一个文档中多次出现,则只会将其添加到索引中一次

    unique属性在索引级别强制执行,因此单个文档可以重复该值,因为它只会在索引中产生一个条目,但其他文档则不能使用该值,因为它需要在索引中添加该值的第二个副本

    为了将这一点带回数据,该示例文档包含两个不同的值,分别为iv.aps.apcMOVAVI。由于该字段是使用unique选项编制索引的,因此该集合中的任何其他文档都不能在该字段中包含这两个值