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遇到主键重复时,会使用新的值进行覆盖,但是复合唯一索引不支持这个操作

转载于:https://www.cnblogs.com/linzhanfly/p/9760821.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值