28.MongoDB唯一索引

  1. 28.MongoDB唯一索引
    1. 28.1 知识点
      1. MongoDB 唯一索引
      2. 特点
      3. 语法
      4. 示例
      5. 注意事项
      6. 总结

28.MongoDB唯一索引


28.1 知识点

MongoDB 唯一索引

MongoDB 的唯一索引(Unique Index)是一种特殊的索引类型,它确保索引字段中的值是唯一的。唯一索引在数据完整性方面非常有用,特别是在需要防止重复数据的场景中,例如用户邮箱、用户名等。

特点

  • 唯一性约束:唯一索引确保在集合中没有两条文档的指定字段值相同。
  • 单字段与复合字段:唯一索引既可以应用于单个字段,也可以应用于多个字段(复合索引),从而保证这些字段组合的唯一性。
  • 默认 _id 唯一索引:MongoDB 默认会在每个集合的 _id 字段上创建唯一索引。
  • 插入/更新限制:当在某个字段上创建唯一索引后,插入或更新文档时,如果新值违反了唯一性约束,则操作会失败。

语法

基础语法

使用 db.collection.createIndex() 方法创建唯一索引:

db.collection.createIndex({ field: 1 }, { unique: true })
  • { field: 1 }:表示索引的字段,1 表示升序索引。
  • { unique: true }:表示该索引为唯一索引。

创建复合唯一索引

复合唯一索引可以确保多个字段的组合值是唯一的:

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

示例

以下是一些实际操作的例子,帮助理解如何使用 MongoDB 的唯一索引。

单字段唯一索引

users 集合中,确保 email 字段唯一:

// 创建唯一索引
db.users.createIndex({ email: 1 }, { unique: true })

// 插入文档
db.users.insertOne({ name: "Alice", email: "alice@example.com" })
// 成功插入

db.users.insertOne({ name: "Bob", email: "alice@example.com" })
// 插入失败,因为 email 重复

复合唯一索引

orders 集合中,每个用户的订单编号必须唯一:

// 创建复合唯一索引
db.orders.createIndex({ userId: 1, orderNumber: 1 }, { unique: true })

// 插入文档
db.orders.insertOne({ userId: 1, orderNumber: 1001, product: "Laptop" })
// 成功插入

db.orders.insertOne({ userId: 1, orderNumber: 1001, product: "Mouse" })
// 插入失败,因为 userId 和 orderNumber 的组合重复

db.orders.insertOne({ userId: 2, orderNumber: 1001, product: "Keyboard" })
// 成功插入,因为 userId 不同

尝试在已有重复数据的字段上创建唯一索引

如果集合中已经存在重复数据,则直接创建唯一索引会失败:

// 插入重复数据
db.users.insertMany([
  { name: "Alice", email: "alice@example.com" },
  { name: "Bob", email: "alice@example.com" } // 重复 email
])

// 尝试创建唯一索引
db.users.createIndex({ email: 1 }, { unique: true })
// 错误:索引创建失败,因为已经有重复数据

唯一索引与稀疏索引

稀疏索引允许文档中不包含索引字段的情况。结合唯一索引,可以实现部分文档的唯一性。

// 创建稀疏唯一索引
db.users.createIndex({ phone: 1 }, { unique: true, sparse: true })

// 插入文档
db.users.insertOne({ name: "Alice" }) // 成功插入,因为 phone 字段不存在
db.users.insertOne({ name: "Bob", phone: "1234567890" }) // 成功插入
db.users.insertOne({ name: "Eve", phone: "1234567890" }) // 插入失败,phone 重复

删除唯一索引

db.collection.dropIndex("index_name")

注意事项

  • 插入与更新校验:唯一索引会对插入和更新操作进行校验,确保不会产生违反唯一性约束的文档。
  • 性能影响:索引的创建和维护会增加写入操作的开销,但能显著提高查询性能。
  • 稀疏索引的使用:稀疏索引只能应用于部分文档,适合字段可能缺失的场景。

总结

MongoDB 的唯一索引(Unique Index)是用来保证某个字段或字段组合的值在集合中是唯一的,是数据完整性的重要工具。以下是本文的核心内容总结:

  • 功能特点

    • 唯一索引可以防止重复数据的插入或更新。
    • 默认情况下,MongoDB 在 _id 字段上会自动创建唯一索引。
  • 创建方式

    • 单字段唯一索引:确保单个字段的值唯一。
    • 复合唯一索引:确保多个字段的组合值唯一。
  • 操作步骤

    • 使用 db.collection.createIndex() 创建唯一索引。
    • 使用 db.collection.dropIndex() 删除索引。
    • 使用 db.collection.getIndexes() 查看现有索引。
  • 注意事项

    • 在已存在重复数据的字段上创建唯一索引会失败,需要先清理数据。
    • 唯一索引结合稀疏索引(Sparse Index)可应用于部分文档。
    • 索引的创建和维护会增加写操作的开销,但能提升查询性能。
  • 典型场景

    • 用户账号系统中的邮箱、用户名等字段需要唯一性。
    • 电商订单系统中用户 ID 和订单编号的组合需要唯一性。

通过合理地使用唯一索引,可以有效保证 MongoDB 数据库的完整性,同时减少开发中因数据重复导致的逻辑错误,从而让系统更加可靠。



转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏