【问题标题】:MongoError: Spring Boot throws E11000 duplicate key errorMongoError:Spring Boot 抛出 E11000 重复键错误
【发布时间】:2020-04-26 18:15:28
【问题描述】:

我一直在尝试使用 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 重复键: { : "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

【问题讨论】:

  • 检查您的IT 集合是否有apc_1 索引。尝试放下它并重新开始
  • No IT 没有任何以 apc 开头的索引 只有 AP 有一个可理解的 apc 索引。
  • 请发布您收藏的db.collection.getIndexes() 输出结果。
  • 您可能正试图将您的数据插入到已经包含一些数据的集合中。在这种情况下不要插入,或者在插入之前清空集合。

标签: java spring mongodb spring-boot


【解决方案1】:

你有一个在 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 个不同值。由于它是使用唯一选项索引的,因此该集合中的任何其他文档都不能在该字段中包含这些值中的任何一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-20
    • 2017-08-27
    • 2018-12-30
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    相关资源
    最近更新 更多