这里写目录标题
mysql
MongoDB
MongoDB系统结构
- 1.1 NoSQL 和 MongoDB
- NoSQL=Not Only SQL,支持类似SQL的功能, 与Relational Database相辅相成。其性能较高,不使用SQL意味着没有结构化的存储要求(SQL为结构化的查询语句),没有约束之后架构更加灵活。
- NoSQL数据库四大家族 列存储 Hbase,键值(Key-Value)存储 Redis,图像存储 Neo4j,文档存储MongoDB
- MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库中功能最丰富最像关系数据库的。在高负载的情况下,通过添加更多的节点,可以保证服务器性能。
MongoDB 体系结构
- 1.1 MongoDB 和RDBMS(关系型数据库)对比
- 1.2 什么是BSON
- BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON,它和JSON一样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和Binary Data类型。BSON可以做为网络数据交换的一种存储形式,是一种schema-less的存储形式,它的优点是灵活性高,但它的缺点是空间利用率不是很理想。
- {key:value,key2:value2} 这是一个BSON的例子,其中key是字符串类型,后面的value值,它的类型一般是字符串
,double,Array,ISODate等类型。BSON有三个特点:轻量性、可遍历性、高效性
- 1.3 BSON在MongoDB中的使用
- MongoDB使用了BSON这种结构来存储数据和网络数据交换。把这种格式转化成一文档这个概念(Document),这里的一个Document也可以理解成关系数据库中的一条记录(Record),只是这里的Document的变化更丰富一些,如Document可以嵌套。
- MongoDB中Document 中 可以出现的数据类型
- 1.4 MongoDB在Linux的安装
- 1.5 MongoDB启动和参数说明
- 1.6 mongo shell 的启动
MongoDB命令
- 1.1 MongoDB的基本操作
- 1.2 MongoDB集合数据操作(CURD)
1.2.1 数据添加
1.2.2 数据查询
比较条件查询
db.集合名.find(条件)
1.2.3 逻辑条件查询
MongoDB索引Index
- 什么是索引
- 索引类型
1.1 单键索引 (Single Field)
MongoDB支持所有数据类型中的单个字段索引,并且可以在文档的任何字段上定义。对于单个字段索引,索引键的排序顺序无关紧要,因为MongoDB可以在任一方向读取索引。
单个例上创建索引:
db.集合名.createIndex({“字段名”:排序方式})
特殊的单键索引 过期索引 TTL ( Time To Live)
TTL索引是MongoDB中一种特殊的索引, 可以支持文档在一定时间之后自动过期删除,目前TTL索引
只能在单字段上建立,并且字段类型必须是日期类型。
1.2 复合索引(Compound Index)
通常我们需要在多个字段的基础上搜索表/集合,这是非常频繁的。 如果是这种情况,我们可能会考虑在MongoDB中制作复合索引。
复合索引支持基于多个字段的索引,这扩展了索引的概念并将它们扩展到索引中的更大域。
制作复合索引时要注意的重要事项包括:字段顺序与索引方向。
1.3 多键索引(Multikey indexes)
针对属性包含数组数据的情况,MongoDB支持针对数组中每一个element创建索引,Multikeyindexes支持strings,numbers和nested
documents
1.4 地理空间索引(Geospatial Index)
针对地理空间坐标数据创建索引。 2dsphere索引,用于存储和查找球面上的点 2d索引,用于存储和查找平面上的点
1.5 全文索引
MongoDB提供了针对string内容的文本查询,TextIndex支持任意属性值为string或string数组元素的索引查询。注意:一个集合仅支持最多一个Text Index,中文分词不理想 推荐ES。
db.集合.createIndex({
"字段": "text"})
db.集合.find({
"$text": {
"$search": "coffee"}}
1.6 哈希索引 Hashed Index
针对属性的哈希值进行索引查询,当要使用Hashed index时MongoDB能够自动的计算hash值,无 需程序计算hash值。注:hash index仅支持等于查询,不支持范围查询。
db.集合.createIndex({
"字段": "hashed"})
MongoDB应用实战
- MongoDB的适用场景
- MongoDB的行业具体应用场景
- 如何抉择是否使用MongoDB
Spring Boot 访问 MongoDB
-
MongoTemplate 的方式
第1步:基于maven新建springboot工程
第2步: 配置文件application.properties
第3步: DAO 实现类 注入 MongoTemplate 完成增删改查
@Autowired protected MongoTemplate mongoTemplate;
第4步: 从Spring容器中获取DAO对象 进行测试 -
MongoRepository 的方式
第1步:基于maven新建springboot工程
第2步: 配置文件application.properties
第3步:编写实体类 并在实体类上打@Document(“集合名”)
第4步:编写 Repository 接口 继承 MongoRepository
方法具体参考
:https://docs.spring.io/springdata/jpa/docs/current/reference/html/#jpa.query-methods.query-creation
如果内置方法不够用 就自己定义 如:定义find|read|get 等开头的方法进行查询
第5步: 从Spring容器中获取Repository对象 进行测试
多数据源配置
yml配置文件:
mongodb:
url: mongodb://user:[email protected]:27017/
database:
test: test
test1: test1
首先创建@Bean:
@Configuration
public class MongoDBConfig {
@Value("${mongodb.url}")
private String mongoUrl;
@Value("${mongodb.database.test}")
private String test;
@Value("${mongodb.database.test1}")
private String test1;
@Primary
@Bean
public MongoTemplate mongoTemplate() {
return new MongoTemplate(
new SimpleMongoClientDatabaseFactory(MongoClients.create(mongoUrl), test));
}
@Bean(name = "TemplateTest")//数据源1的database使用test
public MongoTemplate mongoTemplateTest() {
return new MongoTemplate(
new SimpleMongoClientDatabaseFactory(MongoClients.create(mongoUrl), test));
}
@Bean(name = "TemplateTest1")//数据源2的database使用test1
public MongoTemplate mongoTemplateTest1() {
return new MongoTemplate(
new SimpleMongoClientDatabaseFactory(MongoClients.create(mongoUrl), test1));
}
// 开启事务
@Bean
MongoTransactionManager transactionManager(MongoDatabaseFactory factory){
return new MongoTransactionManager(factory);
}
}
接下来,使用:
@Repository
public class DemoDaoImpl implements DemoDao {
@Autowired
@Qualifier("TemplateTest")
private MongoTemplate mongoTemplateTest;
@Autowired
@Qualifier("TemplateTest1")
private MongoTemplate mongoTemplateTest1;
@Override
public void saveDemo(DemoEntity demoEntity) {
mongoTemplateTest1.save(demoEntity);
}
@Override
public void removeDemoById(Long id) {
Query query = new Query(Criteria.where("id").is(id));
mongoTemplateTest.findAllAndRemove(query,DemoEntity.class);
}
@Override
public void updateDemo(DemoEntity demoEntity) {
Query query = new Query(Criteria.where("id").is(demoEntity.getId()));
Update update = new Update();
update.set("title", demoEntity.getTitle());
update.set("description", demoEntity.getDescription());
update.set("by", demoEntity.getBy());
update.set("url", demoEntity.getUrl());
update.set("corn", demoEntity.getCorn());
mongoTemplateTest.updateFirst(query, update, DemoEntity.class);
}
@Override
public DemoEntity findDemoById(Long id) {
Query query = new Query(Criteria.where("id").is(id));
DemoEntity demoEntity = mongoTemplateTest.findOne(query, DemoEntity.class);
return demoEntity;
}
@Override
public List<DemoEntity> findDemos() {
return mongoTemplateTest.findAll(DemoEntity.class);
}
}