《MongoDB入门教程》第30篇 唯一索引
创始人
2025-06-01 17:18:19
0

本文将会介绍 MongoDB 唯一索引,它可以用于确保文档字段值的唯一性。

唯一索引

很多时候我们需要确保文档中某个字段值的唯一性,例如 email 或者 username。唯一索引(unique index)可以帮助我们实现这种业务规则。实际上,MongoDB 使用唯一索引确保主键 _id 的唯一性。

创建唯一索引的方法和普通索引相同,只需要额外指定 {unique: true} 选项:

db.collection.createIndex({ field: 1}, {unique: true});

索引示例

首先,创建一个新的集合 users,插入一些文档:

db.users.insertMany([{ name: "张三", dob: "1990-01-01", email: "zhangsan@test.com"},{ name: "李四", dob: "1992-06-30", email: "lisi@test.com"}
]);

然后,我们基于 email 字段创建一个唯一索引:

db.users.createIndex({email:1},{unique:true});

接下来我们尝试插入一个已经存在的文档:

db.users.insertOne({ name: "张叁", dob: "1995-03-12", email: "zhangsan@test.com"}
);

此时,MongoDB 将会返回以下错误:

MongoServerError: E11000 duplicate key error collection: book.users index: email_1 dup key: { email: 'zhangsan@test.com' }

下面我们演示一下集合已经存在重复数据时如何创建唯一索引。首先删除并重建集合 users:

db.users.drop()db.users.insertMany([{ name: "张三", dob: "1990-01-01", email: "zhangsan@test.com"},{ name: "张叁", dob: "1995-03-12", email: "zhangsan@test.com"},{ name: "李四", dob: "1992-06-30", email: "lisi@test.com"}
]);

然后,基于 email 字段创建一个唯一索引:

db.users.createIndex({email: 1},{unique:true})MongoServerError: Index build failed: 95f78956-d5d0-4882-bfe0-2d856df18c61: Collection book.users ( 6da472db-2884-4608-98b6-95a003b4f29c ) :: caused by :: E11000 duplicate key error collection: mflix.users index: email_1 dup key: { email: zhangsan@test.com }

以上错误的原因在于 email 中存在重复的记录。

通常,我们会在插入数据之前创建唯一索引,可以从头开始确保数据的唯一性。如果基于已有数据创建唯一索引,可能会由于重复数据导致索引创建失败。为此,我们需要删除重复的数据之后再创建索引。

例如,我们可以首先删除重复的 user:

db.users.deleteOne({ name: "张叁", dob: "1995-03-12", email: "zhangsan@test.com"});{ acknowledged: true, deletedCount: 1 }

然后基于 email 字段创建唯一索引:

db.users.createIndex({email: 1},{unique:true})email_1

复合唯一索引

基于多个字段创建的唯一索引就是复合唯一索引(unique compound index)。复合唯一索引可以确保多个字段值的组合唯一。例如,基于字段 field1 和 field2 创建复合唯一索引,以下数据具有唯一性:

field1field2组合
11(1,1)
12(1,2)
21(2,1)
22(2,2)

以下数据存在重复值:

field1field2组合
11(1,1)
11(1,1) 重复
21(2,1)
21(2,1) 重复

接下来我们看一个示例,首先创建一个集合 locations。

db.locations.insertOne({address: "北京市丰台区莲花池东路118号北京西站",latitude: 39.894793,longitude: 116.321592
})

然后,基于 latitude 和 longitude 创建一个复合唯一索引:

db.locations.createIndex({latitude: 1,longitude: 1
},{ unique: true });'latitude_1_longitude_1'

插入一个经度相同的地点:

db.locations.insertOne({address: "北京市海淀区复兴路甲9号中华世纪坛",lat: 39.910577,long: 116.321592
})

操作执行成功,因为复合索引 latitude_1_longitude_1 校验的是经度和纬度的组合值。

最后,插入一个经纬度已经存在的地点:

db.locations.insertOne({address: "北京市丰台区莲花池东路118号北京西站",latitude: 39.894793,longitude: 116.321592
})

此时,MongoDB 返回重复键错误:

MongoServerError: E11000 duplicate key error collection: book.locations index: latitude_1_longitude_1 dup key: { lat: 39.894793, long: 116.321592 }

相关内容

热门资讯

提振消费,如何增强供需适配性 云南大理白族自治州,游客(左)与摄影师一起挑选照片。 北京朝阳区,一名智能柜补货员在卸货。 以上图...
贝仕达克:预计2025年度净利... 每经AI快讯,贝仕达克1月30日晚间发布业绩预告,预计2025年归属于上市公司股东的净利润860万元...
英媒:随着就业市场降温,美国大... 来源:格隆汇APP 格隆汇1月30日|据英国金融时报,本周,美国的一些大型企业公布了裁员计划,预计将...
终结5连败!德约3-2逆转辛纳... 北京时间1月30日,2026赛季网球大满贯澳大利亚公开赛继续进行,在男单下半区的半决赛中,塞尔维亚天...
去年辽宁非金融企业债务融资达6... 1月30日,人民银行辽宁省分行召开2026年一季度新闻发布会,介绍2025年度辽宁省金融运行主要情况...
“大V带货”遭监管重拳:基金销... 记者 洪小棠 1月29日,证监会证券基金机构监管司发布了新一期《机构监管情况通报》(下称《通报》),...
ST宁科完成组织架构重大调整 ... 来源:新浪财经-鹰眼工作室 【财经网讯】宁夏中科生物科技股份有限公司(证券代码:600165,股票简...
原创 i... 很多人看到苹果这份“史上最强”季度成绩单时,第一反应都是:这销量也太夸张了吧? 尤其是大中华区 ...
Cloudflare入驻B站和... IT之家 1 月 30 日消息,Cloudflare 宣布入驻B站和小红书,认证显示为“Cloudf...
首日涨超160% 智能制造装备... 上证报中国证券网讯(记者 张雪)1月30日,美德乐正式登陆北交所。截至当日收盘,公司股价报109.5...
特朗普提名下一任美联储主席 据新华社消息,美国总统特朗普30日提名美联储前理事凯文·沃什为下任美联储主席,这一提名还需获得参议院...
由盈转亏、业绩下滑超85%!2... 面对每天上千份上市公司公告该看哪些?重大事项公告动辄几十页几百页重点是啥?公告里一堆专业术语不知道算...
原创 华... 金价的上涨和美元的下跌已经让整个依赖美西方货币体系和金融体系获利的人感受到了巨大的威胁。 在美国财政...
康佳集团原董事长周彬、原副总裁... 老牌家电巨头康佳集团(000016)在经历控制权变更与管理层换血的震荡期后,迎来了更为剧烈的“余震”...
安诚财险2025年揽收保费52... (图片来源:视觉中国) 蓝鲸新闻1月30日讯(记者 陈晓娟)日前,安诚财产保险股份有限公司(下称“安...
国际金价、银价,暴跌! 据新华社1月30日消息,国际黄金和白银价格1月29日上演“过山车”行情,双双站上高位后又暴跌,市场剧...
A股115家半导体公司2025... 近期,A股半导体行业上市公司陆续披露半年度业绩预告。据集微网统计,截至2026年1月30日,在已披露...
一图读懂服务消费新政:涉及交通... 红星资本局1月30日消息,为优化和扩大服务供给,聚焦重点领域、潜力领域,加快培育服务消费新增长点,促...
沪农商行:着力于稳健运营、控制... 证券日报网1月30日讯 ,沪农商行在接受调研者提问时表示,投资交易策略方面,公司将基于对2026年宏...
实力“圈粉”全球客:去年上海离... 记者从市税务局获悉,2025年境外旅客在沪办理退税申请单数量同比增长3倍,退税商品销售额和退税额均增...