Docs 菜单
Docs 主页
/
MongoDB Manual
/ / /

将现有索引转换为唯一索引

在此页面上

  • 开始之前
  • 步骤
  • 了解详情

要将非唯一索引转换为唯一索引,请使用 collMod命令。 collMod命令提供了一些选项,用于在完成转换之前验证索引字段是否包含唯一值。

1

创建 apples 集合:

db.apples.insertMany( [
{ type: "Delicious", quantity: 12 },
{ type: "Macintosh", quantity: 13 },
{ type: "Delicious", quantity: 13 },
{ type: "Fuji", quantity: 15 },
{ type: "Washington", quantity: 10 }
] )
2

type 字段上添加单个字段索引:

db.apples.createIndex( { type: 1 } )
1

type 字段索引上运行 collMod 并将 prepareUnique 设置为 true

db.runCommand( {
collMod: "apples",
index: {
keyPattern: { type: 1 },
prepareUnique: true
}
} )

设置 prepareUnique 后,您将无法插入与索引键条目重复的新文档。例如,以下插入操作会导致错误:

db.apples.insertOne( { type: "Delicious", quantity: 20 } )
MongoServerError: E11000 duplicate key error collection:
test.apples index: type_1 dup key: { type: "Delicious" }
2

要查看是否有任何文档违反了 type 字段的唯一约束,请使用 unique: truedryRun: true 运行 collMod

db.runCommand( {
collMod: "apples",
index: {
keyPattern: { type: 1 },
unique: true
},
dryRun: true
} )
MongoServerError: Cannot convert the index to unique. Please resolve conflicting documents before running collMod again.
Violations: [
{
ids: [
ObjectId("660489d24cabd75abebadbd0"),
ObjectId("660489d24cabd75abebadbd2")
]
}
]
3

要完成转换,请修改重复条目以消除任何冲突。例如:

db.apples.deleteOne(
{ _id: ObjectId("660489d24cabd75abebadbd2") }
)
4

要确认可以转换索引,请使用 dryRun: true 重新运行 collMod() 命令:

db.runCommand( {
collMod: "apples",
index: {
keyPattern: { type: 1 },
unique: true
},
dryRun: true
} )
{ ok: 1 }
5

如要完成到唯一索引的转换,请运行 unique: truecollMod 命令并删除 dryRun 标记:

db.runCommand( {
collMod: "apples",
index: {
keyPattern: { type: 1 },
unique: true
}
} )
{ unique_new: true, ok: 1 }

后退

Unique Indexes