MongoDB的复合唯一索引
一 创建
- JavaScript Shell
db.room.ensureIndex({'floor':1,'num':1})
- Spring Data
@Data // lombok
@Document(collection = "room")
@CompoundIndexes({
// 唯一复合索引:楼层和房号不能相同,不然就是同一个房间了
@CompoundIndex(name = "floor_num", def = "{'floor' : 1, 'num': 1}",unique=true)
})
public class Room {
@Id
private String id;
// 楼层
private int floor;
// 房号
private int num;
// 建造时间
private Date createAt;
}
二 疑问
(1)日期字段能与其他字段复合为唯一索引吗?
可以,mongodb存储的是时间戳,实际上转换成数字进行复合比较的。
(2)插入重复数据会发生什么?
- JavaSript Shell:重复key值异常
> [Error] index 0: 11000 - E11000 duplicate key error collection: ...
- Spring:重复key值异常
org.springframework.dao.DuplicateKeyException: Write failed with error code 11000 and error message 'E11000 duplicate key error collection:...'
Caused by: com.mongodb.DuplicateKeyException: Write failed with error code 11000 and error message 'E11000 duplicate key error collection:
(3)批量插入时,发生重复key值异常,数据存储状态是怎样的?
- 猜测1:所有数据回滚,发生异常,所有数据不保存
- 猜测2:插入成功的数据入库,发生异常后,后面的数据不入库。
- 猜测3:发生异常的数据跳过,正常数据入库。
- 猜测4:重复key值的文档用新的数据覆盖。
答案:猜测2是对的。mongodb不支持事务,所以猜测1不正常,mongodb不会回滚;跳过异常数据继续入库,什么鬼,哪有这么强大的数据库,猜测3不成立;猜测4是源于insert和save操作的对比,save遇到主键重复时,会使用新的值进行覆盖,但是复合唯一索引不支持这个操作。
MongoDB的复合唯一索引的更多相关文章
- MongoDB小结25 - 复合唯一索引
只要满足索引的其中之一不同即可 db.blog.ensureIndex({"username":1,"blogname":1}) 作者和作品名其中之一不同即可创 ...
- MongoDB分片,唯一索引与upsert
前言 分片,唯一索引和upsert,表面上看似没有直接联系的几个东西,到底存在怎样的瓜葛呢? 分片 为了保持水平扩展的有效性,分片功能必须保证各个片之间没有直接关联,不需要与其他分片交互就可以独立做出 ...
- mongodb学习-创建唯一索引(在已存在的集合创建)
如果在已存在的集合创建,可能会存在相同的值如下: 我们可以使用(2.x版本) db.users.ensureIndex({uid:1, name:1}, {unique:true, dropDups: ...
- MongoDB学习笔记-04 索引
索引是用来加速查询的.有了索引之后,数据库不必进行全表扫描,只需先在索引中查找,再根据找到的索引查找数据.MongoDB的索引几乎和传统关系型数据库一样. 创建索引 创建索引是在相应的集合中使用ens ...
- mongodb学习笔记之索引(转)
一.索引基础: MongoDB的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的优化技巧.下面是创建索引的命令: > db.test.ensureIndex({" ...
- MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划
这篇文章主要介绍了MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划的相关资料,需要的朋友可以参考下 一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存 ...
- MongoDB 创建基础索引、组合索引、唯一索引以及优化
一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存在system.indexes 中,且默认总是为_id创建索引,它的索引使用基本和MySQL 等关系型数据库一样.其实可以这样说说,索引 ...
- 【hibernate/JPA】对实体类的的多个字段建立唯一索引,达到复合主键的效果【spring boot】注解创建唯一索引和普通索引
对实体类的的多个字段建立唯一索引,达到复合主键的效果 package com.sxd.swapping.domain; import lombok.Getter; import lombok.Sett ...
- mongodb 索引,全文索引与唯一索引
唯一索引创建: db.createIndex({name: 1}, {unique: true})
随机推荐
- springmvc配置jackson时遇到的一些问题
在没接触springmvc之前我们在servlet中想返回前台json数据时,都是自定义一个JSONObject和JSONArray,然后调用response.getWriter()对象的方法返回js ...
- linux下的usb抓包方法
1 linux下的usb抓包方法1.配置内核使能usb monitor: make menuconfig Device Drivers --> ...
- TransitionDrawable
ayerDrawable的一个子类,TransitionDrawable只管理两层的Drawable!两层!两层! 并且提供了透明度变化的动画,可以控制一层Drawable过度到另一层Drawable ...
- 利用mysql数据库中的TMD表修复“is marked as crashed and last (automatic?) repair failed”的错误 Database query error
===========================测试成功============================================= 1.页面出现错误:Database query ...
- android popupwindow 位置显示
1.在控件的上方: private void showPopUp(View v) { LinearLayout layout = new LinearLayout(this); layout.setB ...
- JAVA 基础编程练习题26 【程序 26 求星期】
26 [程序 26 求星期] 题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续 判断第二个字母. 程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或 if ...
- centos6.x一直停留在进度条的问题
由于屏幕关闭加上长时间没有操作可能导致centos进行深度休眠,此时只能通过电源键来强制重启.可以通过修改X11的配置来禁止休眠,配置文件为/etc/X11/xorg.conf,注意修改此文件前记得备 ...
- 使用FRP配置Windows远程控制
一款很好用的内网穿透工具--FRP 前言 使用内网穿透工具--FRP,以及一台云服务器当做服务端,进行简单配置后即可远程访问 配置 FRP 服务端的前提条件是需要一台具有公网 IP 的设备,得益于 F ...
- 关于LuckyE博客的前言
第一次开始尝试怎么写博客,也不知道写点什么好...... 开始写博客的原因其实很多,主要原因是因为最近考出cisp-pte证书,然后前几天电话面试某比较有名的安全公司(x盟)的渗透测试工程师实习生被撸 ...
- linux之dup和dup2函数解析
1. 文件描述符在内核中数据结构在具体说dup/dup2之前,我认为有必要先了解一下文件描述符在内核中的形态.一个进程在此存在期间,会有一些文件被打开,从而会返回一些文件描述符,从shell中运行一个 ...