mongodb

【mogoDB】mongoDB唯一性约束索引 {unique:

2024-11-27  本文已影响0人  放纵不基

mongoDB创建索引失败解析

> use testDB

> db.T_Test.ensureIndex({"oid":1,"day":1,"codeId":1},{unique:true},{background: 1});
{
        "ok" : 0,
        "errmsg" : "E11000 duplicate key error collection: testDB.T_Test index: oid_1_day_1_codeId_1 dup key: { : \"64d0ada0d08e8f52db791c71\", : \"2023-10-21\", : \"5ed1a7875c1b4bf39ea7123b2dd16788\" }",
        "code" : 11000,
        "codeName" : "DuplicateKey"
}

您在创建 MongoDB 索引时遇到了 E11000 duplicate key error 错误。
这个错误表示在您尝试创建唯一索引时,MongoDB 检测到已有的文档在目标字段组合上存在重复数据,违反了唯一性约束。

错误信息解析

错误的原因

您试图在集合 T_Template_UseRecord 上创建一个 唯一索引,该索引涵盖了字段 oiddaycodeId。MongoDB 在创建索引时,会确保该组合在集合中的所有文档都是唯一的。但是,集合中已经存在至少一对重复的 oid, day, 和 codeId 组合,因此导致了这个错误。

解决方案

  1. 检查重复数据

    • 首先,您可以查询集合中是否已经存在相同的 oid, day, codeId 组合。可以通过以下查询来确认重复的记录:
      db.T_Test.aggregate([
        { $group: { _id: { oid: "$oid", day: "$day", codeId: "$codeId" }, count: { $sum: 1 } } },
        { $match: { count: { $gt: 1 } } }
      ])
      
      这个聚合查询将返回所有重复的 oid, day, codeId 组合及其重复次数。
  2. 清理重复数据

    • 如果发现有重复数据,您需要决定如何处理这些重复文档。常见的做法包括:
      • 删除重复记录:您可以删除重复的文档,只保留一条。
      • 修改数据:如果重复是由于某些业务逻辑错误导致的,您可能需要修改或合并重复的数据。

    示例删除重复记录(假设您已经查找到重复项):

    db.T_Test.remove({ "oid": "64d0ada0d08e8f52db791c71", "day": "2023-10-21", "codeId": "5ed1a7875c1b4bf39ea7123b2dd16788" });
    
  3. 重新创建索引

    • 一旦解决了重复数据问题,就可以尝试重新创建索引:
      db.T_Test.createIndex({"oid": 1, "day": 1, "codeId": 1}, {unique: true, background: true});
      

其他注意事项

总结

您的错误主要是由于数据中存在违反唯一约束的重复项。解决方法是首先找出并清理重复的记录,然后再重新创建索引。这可以确保您的数据在新索引生效后是唯一的。

创建索引,加不加 unique: true 选项,有什么区别?

在 MongoDB 中,创建索引时是否使用 unique: true 选项,区别非常大,主要体现在 索引的约束行为 上。下面是加上 unique: true 与不加该选项时的主要区别:

1. unique: true 选项的作用

示例:使用 unique: true

db.collection.createIndex({ "field1": 1, "field2": 1 }, { unique: true });

错误示例:

假设有一个字段组合 field1: 1, field2: 1,如果已经有一条记录 { field1: "A", field2: "B" },然后插入另一条记录 { field1: "A", field2: "B" },MongoDB 会返回一个错误:

E11000 duplicate key error collection: mydb.collection index: field1_1_field2_1 dup key: { : "A", : "B" }

2. 不使用 unique: true 选项(默认行为)

示例:没有 unique: true

db.collection.createIndex({ "field1": 1, "field2": 1 });

不会报错的情况:

假设已经存在一条记录 { field1: "A", field2: "B" },然后您插入一条记录 { field1: "A", field2: "B" },由于没有设置 unique: true,MongoDB 允许这个操作,而不会报错。

3. 性能区别

4. 适用场景

5. 如何使用索引

总结

是否使用 unique: true 取决于您的应用需求:如果需要保证数据的唯一性,则使用 unique: true;如果只关心查询性能,不在乎重复数据,则可以省略该选项。

上一篇 下一篇

猜你喜欢

热点阅读