项目需求:
用户表中有mobile手机字段,允许空,但是如果填写了就不能重复。
mobile: {
type: String,
unique: true,
dropDups: true,
default:null
}
一开始我是这样定义的,但是插入第二条null时,就会报错11000错误。
那么我们把default:null去掉行不行?亲自实验过也不行,仍然会抱11000错误,数据重复,也就是说确定了唯一约束后,必须这个字段有值,且不能重复。
网上查了很多文章,了解到关键词sparse: true,解释基本都是复制的,听到最多的话就是:
稀疏索引仅包含具有索引字段的文档的条目,即使索引字段包含空值也是如此。索引会跳过缺少索引字段的任何文档。配合唯一索引使用,即可实现对存在的字段才使用唯一索引。
这样一段话,说的云里雾里的,谁能明白?
经过我多次postman实现,不断删除表格新建表格,得出的结论是
mobile: {
type: String,
unique: true,
dropDups: true,
sparse: true
}
必须把default:null去掉,再插入数据的时候,不要写入mobile字段,也就是说集合中不存在mobile字段,那么这样就可以重复添加了,当然一旦有mobile字段,就必须是唯一了。
当然其实这样解决方案还是不如关系型数据,当然没有mobile的集合检索出来时,那就没有这个字段了,感觉有点奇怪!