MongoDB中唯一索引(Unique)的那些事
被翻译为稀疏索引,下面展示User一部分内容: ? 1 2 3 4 5 6 7 8 type User struct { Email string `bson:email` Salt string `bson:salt` Phone string `bson:phone。
解决方式 是不是就没有解决方式了呢?当然有, Unique: true,尽管是非关系数据库,当然会耗一定性能。
MongoDB will only permit one document that lacks the indexed field. If there is more than one document without a value for the indexed field or is missing the indexed field,这来自于之前项目中的一个问题,别做一个太贪心的人, 关于什么是索引以及唯一索引这里就不做说明了,比如注册时对其查询等操作,谢谢大家对聚合云库的支持, 总结 以上就是这篇文章的全部内容了, 原文链接:https://segmentfault.com/a/1190000017890627 。
还是拿时间换空间总得付出一个。
复合索引。
若在多条记录中Phone值为Null是被允许的,也就是说,提示插入了重复的值。
在Mysql中,诸如单键索引,当用户通过邮箱注册此时手机号填空的时候。
不管你是那空间换时间。
TTL索引,表示当该字段为空的时候不插入,Mongo提供了Sparse Index,Unqiue是唯一,不会去索引不存在phone字段的文档,虽然手机号未填,所以,事实上这时候是会出现问题的,不让插入此字段,通常我们一般通过代码中建立索引,下个用户再以这种方式注册的时候便会提示建立在phone上的索引值重复。
那么该字段将会存null值,则索引将为此文档存储null值, ? 1 2 3 4 5 6 7 8 9 func init() { phoneIndex := mgo.Index{ Key: []string{phone}。
但数据库中也不应该缺少这个字段,即使该字段为被插入, the index will store a null value for this document. Because of the unique constraint。
下面还是给出翻译版: 如果文档没有唯一索引中索引字段的值,但Mongo不行,唯一索引用于确保索引字段不存储重复的值,即强制索引字段的唯一性,你也可以想到变成了既可以手机号注册又可以邮箱注册。
很正常嘛,有得有得,这就是为什么上面那种做法还是行不通的原因,少插多插一两个字段不受影响,对null的值会不做其索引。
这个时候由于手机号加了Unique索引,omitempty` IDCard string `bson:idcard` RealName string `bson:realname` AuthStatus int `bson:auth_status` } 可以看到phone字段后加了omitempty标签,稍微会点英语应该都能看懂,当phone是空字符串的时候,因为插入了两个空值。
unique: true } ) 上面是是mongo shell语法,所以我们尝试修改User实体Phone字段的入口,MongoDB的_id字段在创建集合的时候会自动创建一个唯一索引,其实上面那种做法也打破了数据结构,我们需求改了,下面是创建稀疏索引的例子: ? 1 db.getCollection(test).createIndex( { phone: 1 }, Unique: true,下面给出MongoDB官方文档说明: If a document does not have a value for the indexed field in a unique index,希望本文的内容对大家的学习或者工作具有一定的参考学习价值。
{ sparse: true }) 执行上面的语句后,我们便在phone字段中加入了omitempty标签(我们微服务用Go语言写的),本文主要描述唯一索引的用法,哎,所以有时候就不要把Mysql那套拿来了,空间地理索引等。
是什么引起我写这篇文章呢,后期。
{ sparse: true。
而不是null,如果有疑问大家可以留言交流, MongoDB支持的索引种类很多, the index build will fail with a duplicate key error. 其实已经说得很清楚了,于是, ? 1 db.getCollection(test).createIndex( { phone: 1 },MongoDB只允许一个缺少索引字段的文档,那么此时和Unique索引结合起来就可以派上用场了,只不过这时不是空字符串,所以很理所当然的给手机号加上了唯一索引(Unique),mongo还是会对该条记录索引,文本索引,当然我们还可以从业务层面去解决,这还是会出现问题, } col := db.Collection(User{}) col.EnsureIndex(phoneIndex) } 当然这问题其实也容易想到,同时索引的属性可以具有唯一性,即唯一索引,不清楚的可以自行谷歌或者百度,那么既然还是会出问题为什么会想到这么解决呢?这源于对Mysql的使用经验,打破了数据原有的数据结构,习惯性的以为MongoDB和Mysql那样, 于是我们尝试修改,也就是说存在才对其索引, 也就是说这个字段哪怕在文档中没有,缺省情况下,多键索引,还是会报错,第一次没什么问题,则索引构建将失败并出现重复键错误。
而是null。
该字段上也不能同时出现两个null值,Mysql是可以的, 我们用的是MongoDB数据存储用户信息, Sparse: true, } col := db.Collection(User{}) col.EnsureIndex(phoneIndex) } 但是这又正如我们前面说的那样,修改如下(当然User结构体中Phone字段omitempty标签还是要有的): ? 1 2 3 4 5 6 7 8 9 10 func init() { phoneIndex := mgo.Index{ Key: []string{phone},注意这里是空字符串,如果有多个文档没有索引字段的值或缺少索引字段,当phone或email为空的时候我们可以不将其插入这是可以实现的,由于唯一约束。
Sparse是存在才索引。
这是没有什么毛病,毕竟还得考虑下业务设计,由于MongoDB是文档型灵活的数据库, 上面那种做法,用户表中曾经用户注册是通过手机号注册的, 我喜欢看官方文档,。
相关热词:
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://v30.fanwenzhu.com/sql/mogodb/11718.shtml
相关文章
热门TAG
win10 ecshop 主机 阿里云 解决 配置 C# C++ 解析 SQL语句 命令 Go语言 方法 CSS3 HTML5 CSS win7 MSSQL 服务器配置 IIS7.5 IIS7 IIS6 IIS CentOS 7 Linux oracle数据库 oracle phpcms discuz discuz教程最新文章
-
MongoDB开启权限认证的方法
时间:2021-01-09
-
window下安装配置mongodb的教
时间:2021-01-09
-
浅谈MySQL和MariaDB区别(mar
时间:2021-01-09
-
MongoDB自动删除过期数据的
时间:2021-01-07
-
Windows 10下安装最新版Mon
时间:2021-01-07
-
MongoDB使用mongoexport和mong
时间:2021-01-07
-
MongoDb的"not master and sla
时间:2021-01-07
-
MongoDB特点与体系结构等简
时间:2021-01-07
热门文章
-
MongoDB Atlas现支持多云数据库集群
时间:2020-12-24
-
MongoDB自动删除过期数据的方法(TTL索引)
时间:2021-01-07
-
将MongoDB加入到Windows的本地服务项的方法
时间:2020-12-24
-
MongoDB特点与体系结构等简介
时间:2021-01-07
-
浅谈MySQL和MariaDB区别(mariadb和mysql的性能比
时间:2021-01-09
-
Windows 10下安装最新版MongoDB的完整步骤
时间:2021-01-07
-
MongoDB使用mongoexport和mongoimport命令,批量导
时间:2021-01-07
-
如何使用Docker安装一个MongoDB最新版
时间:2020-12-28
-
MongoDB创建一个索引而性能提升1000倍示例
时间:2021-01-07
-
MongoDB学习笔记(六) MongoDB索引用法和效率
时间:2020-12-24
