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

时间: 2024-11-04 23:28:16

MongoDB的复合唯一索引的相关文章

mongodb学习笔记之索引(转)

一.索引基础:    MongoDB的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的优化技巧.下面是创建索引的命令:    > db.test.ensureIndex({"username":1})    可以通过下面的名称查看索引是否已经成功建立:    > db.test.getIndexes()    删除索引的命令是:    > db.test.dropIndex({"username":1})    在MongoDB中,我们

MongoDB学习笔记-04 索引

索引是用来加速查询的.有了索引之后,数据库不必进行全表扫描,只需先在索引中查找,再根据找到的索引查找数据.MongoDB的索引几乎和传统关系型数据库一样. 创建索引 创建索引是在相应的集合中使用ensureIndex()方法. >db.user.ensureIndex({"username":1}) 要创建查询中用到的所有键的索引.传递给ensureIndex方法的文档形式与传递给sort的一样:1或-1表示索引的方向.若索引只有一个键时,方向则无关紧要. >db.user

mysql删除表中重复数据创建唯一索引。

表结构如下,需要增加xx,yy复合唯一索引.create table table_a (id int(11) NOT NULL AUTO_INCREMENT,xx int(11) NOT NULL,yy int(11) NOT NULL,PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8; 保留最小iddelete a.* from table_a as a,( select min(id) id , xx,yy from table_a g

MySQL普通索引、唯一索引、主索引、外键索引、复合索引、全文索引的使用

1.普通索引 普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度.因此,应该只为那些最经常出现在查询条件(WHERE column = ...)或排序条件(ORDER BY column)中的数据列创建索引.只要有可能,就应该选择一个数据最整齐.最紧凑的数据列(如一个整数类型的数据列)来创建索引. 2.唯一索引 普通索引允许被索引的数据列包含重复的值.比如说,因为人有可能同名,所以同一个姓名在同一个"员工个人资料"数据表里可能出现两次或更多次. 如果能确定

MongoDB 创建基础索引、组合索引、唯一索引以及优化

一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存在system.indexes 中,且默认总是为_id创建索引,它的索引使用基本和MySQL 等关系型数据库一样.其实可以这样说说,索引是凌驾于数据存储系统之上的另一层系统,所以各种结构迥异的存储都有相同或相似的索引实现及使用接口并不足为 奇. 1.基础索引 在字段age 上创建索引,1(升序);-1(降序): db.users.ensureIndex({age:1})1_id 是创建表的时候自动创建的索引,此索引是不能够删除的.当

通俗易懂 索引、单列索引、复合索引、主键、唯一索引、聚簇索引、非聚簇索引、唯一聚簇索引 的区别与联系

索引 数据库只做两件事情:存储数据.检索数据.而索引是在你存储的数据之外,额外保存一些路标(一般是B+树),以减少检索数据的时间.所以索引是主数据衍生的附加结构. 一张表可以建立任意多个索引,每个索引可以是任意多个字段的组合.索引可能会提高查询速度(如果查询时使用了索引),但一定会减慢写入速度,因为每次写入时都需要更新索引,所以索引只应该加在经常需要搜索的列上,不要加在写多读少的列上. 单列索引 与 复合索引 只包含一个字段的索引叫做单列索引,包含两个或以上字段的索引叫做复合索引(或组合索引).

4.非关系型数据库(Nosql)之mongodb:普通索引,唯一索引

 一:普通索引 1创建一个新的数据库 > use toto; switched to db toto > show dbs; admin (empty) local 0.078GB > use toto; switched to db toto > db toto > 2创建100万条数据 > for(var i=1; i <= 1000000; i++){ ...db.c3.insert({name:"zhangsan",age:i});

普通索引、唯一索引、主索引、外键索引、复合索引、非主码索引、聚集主码(聚集索引)、单列索引、多列索引

强烈建议看了第一个参考文献再来看这个篇博文,因为此处不准备讲底层数据结构的实现. 索引:索引(Index)是帮助MySQL高效获取数据的数据结构.提取句子主干,就可以得到索引的本质:索引是数据结构.其表达的是存储引擎的范畴,也就是说只有在存储引擎级别谈索引才有意义.MyISAM.InnoDB.Memory等.此处单纯就InnoDB存储引擎讨论. B-TREE.B+TREE数据结构. 在数据之外,数据库系统还维护着满足特定查找算 法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这

mongoDB常见的查询索引(三)

1. _id索引 _id索引是绝大多数集合默认建立的索引 对于每个插入的数据,MongoDB会自动生成一条唯一的_id字段. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 > db.jerome_2.collection.insert({x:2}) WriteResult({ "nInserted" : 1 }) > db.jerome_2.collection.getIndexes() [     {         "v&quo