对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。

在现有的分片集合上创建唯一索引

您可以在已分片的集合上创建新的唯一索引,但前提是索引包含分片键作为前缀。

索引上的唯一性约束可确保集合中的文档具有唯一的索引字段值。对于分片的集合,仅当索引是分片键或包含分片键作为前缀时, MongoDB才会强制执行唯一性。

对于已分片的集合,除非包含分片键作为前缀,否则无法在其他字段上创建唯一索引。如果索引不包含分片键作为前缀,则当您运行 createIndexes 命令时,MongoDB 会返回错误。

有关应用于分片的集合上唯一索引的约束,以及如何保持不属于分片键的字段的唯一性,请参阅保持分片集群中的唯一性。

  • 确定集合的分片键。要查看分片键,运行 sh.status() 方法,并在输出中查找集合。

  • 确认现有文档不违反该字段的唯一性约束。如果分片包含具有重复值的文档,则创建索引操作可能在没有重复项的分片上成功,但在有重复项的分片上失败,从而导致跨分片的索引不一致。

以下示例在 accounts.names集合的 region_id 和 email 字段上创建唯一复合索引,该集合在 region_id字段上分片的。

1

运行 sh.status() 方法,在输出中找到 accounts.names 集合,以确认分片键是 region_id:

sh.status()
2

创建唯一索引并将分片键region_id 作为复合索引的前缀:

db.names.createIndex( { region_id: 1, email: 1 }, { unique: true })
region_id_1_email_1