MongoDB 踩坑记录(可能会持续更新)

栏目: 数据库 · 发布时间: 6年前

内容简介:使用 Hibernate 的时候我们可以利用MongoDB 默认会使用生成的 ObjectId 作为主键 ID:如果想使用自定义的 ID,也可以将

数据校验

使用 Hibernate 的时候我们可以利用 javax.validation 包中提供的一系列 API 对传入数据库的数据进行校验。使用 MongoDB 时,需要显式的在配置当中打开,不然校验不会生效:

@Configuration
public class DataSourceConfig {

    @Bean
    public ValidatingMongoEventListener validatingMongoEventListener() {
        return new ValidatingMongoEventListener(validator());
    }

    @Bean
    public LocalValidatorFactoryBean validator() {
        return new LocalValidatorFactoryBean();
    }
}

索引有关

使用非 ObjectId 作为 Id

MongoDB 默认会使用生成的 ObjectId 作为主键 ID:

@Data
@Document
public class Book {
    @Id
    private String id;
    // ...
}

如果想使用自定义的 ID,也可以将 @Id 加在自定义字段上:

@Data
@Document
public class Book {
    @Id
    private String bookId;
    // ...
}

但注意,这时 bookId 一定要进行初始化操作,不然 MongoDB 仍然会生成一个 ObjectId 作为主键。

同时,主键 @Id 一定是唯一的,因此不需要再使用 @Indexed

联合索引

MySQL 类似,MongoDB 的联合索引(Compound Index)也是按照最左原则进行匹配的。例如下面一个索引:

@Data
@Document
@CompoundIndexes({
        @CompoundIndex(name = "code_and_owner_idx", unique = true, def = "{'code': 1, 'ownerId': 1}")
})
public class Book {
    @Id
    private String bookId;

    @NotBlank
    private String code;

    @NotBlank
    private String ownerId;
}

使用 codeownerId 进行查询会 hit 到索引,使用 code 查询会 hit 到索引,但使用 ownerId 进行查询则会进行 Document 扫描,当数据量大的时候性能会有非常大的下降。因此在建立联合索引的时候应该特别注意字段的顺序。

事务有关

MongoDB 3.X 并不支持多 Document 的事务。MongoDB 4.0 才开始支持多 Document 的事务。

当在 Spring 使用时,单纯的加入 @Transactional 是不行的,需要显式的在配置当中打开:

@Configuration
public class DataSourceConfig {

    @Bean
    MongoTransactionManager transactionManager(MongoDbFactory dbFactory) {
        return new MongoTransactionManager(dbFactory);
    }
}

MongoDB 4.0 的事务支持并不支持单机(Standalone)部署,因此如果使用本地开发的单机 MongoDB,加上 @Transactional 进行操作,会直接导致崩溃(MongoDrive 3.8.2)。

同时 MongoDB 4.0 不支持在分片(Sharding)部署上使用,对分片的支持计划 4.2 才推出。考虑到大部分公司使用的还是 3.X 的版本,因此 MongoDB 现在的事务支持基本是不可用的。设计 Mongo 文档格式的时候,应考虑尽量减少多文档事务的操作,

参考资料


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

细节决定交互设计的成败

细节决定交互设计的成败

张亮 / 2009-3 / 49.00元

《细节决定交互设计的成败》是一本非常实用的有关软件界面的交互设计和可用性设计方面知识的书籍,通过采用一问一答的形式,你将会有针对性地学习到一些能够很快应用在自己软件开发工作中的细节知识和诀窍。例如,如何减轻用户的等待感,如何预防和减少用户的使用错误等。另外,你会发现阅读《细节决定交互设计的成败》时会非常轻松和愉悦;这是由于《细节决定交互设计的成败》写作上的两个特点:第一,采用较多日常生活中的例子来......一起来看看 《细节决定交互设计的成败》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

在线进制转换器
在线进制转换器

各进制数互转换器

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具