Mongodb总结
一、NoSQL型数据库介绍
NoSQL,泛指非关系型的数据库。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。
NoSQL数据库有四大分类,分别是:键值存储数据库,列存储数据库,文档型数据库和图形数据库。总结NoSQL数据库在以下的这几种情况下比较适用:
- 数据模型比较简单;
- 需要灵活性更强的IT系统;
- 对数据库性能要求较高;
- 不需要高度的数据一致性;
- 对于给定key,比较容易映射复杂值的环境。
二、MongoDB介绍
MongoDB 是目前在IT行业非常流行的一种非关系型数据库(NoSql),其灵活的数据存储方式备受当前IT从业人员的青睐。MongoDB很好的实现了面向对象的思想(OO思想),在MongoDB中 每一条记录都是一个Document对象。
MongoDB最大的优势在于所有的数据持久操作都无需开发人员手动编写SQL语句,直接调用方法就可以轻松的实现CRUD操作。
MongoDB的文档模型自由灵活,可以让你在开发过程中畅顺无比。对于大数据量、高并发、弱事务的互联网应用,MongoDB可以应对自如。MongoDB内置的水平扩展机制提供了从百万到十亿级别的数据量处理能力,完全可以满足Web2.0和移动互联网的数据存储需求,其开箱即用的特性也大大降低了中小型网站的运维成本。
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。它是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。MongoDB最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有:
- 面向集合存储,易存储对象类型的数据。
- 模式自由。
- 支持动态查询。
- 支持完全索引,包含内部对象。
- 支持查询。
- 支持复制和故障恢复。
- 使用高效的二进制数据存储,包括大型对象(如视频等)。
- 自动处理碎片,以支持云计算层次的扩展性。
- 支持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
- 文件存储格式为BSON(一种JSON的扩展)。
- 可通过网络访问。
三、mongo使用场景
mongodb的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)以及传统的RDBMS系统(丰富的功能)架起一座桥梁,集两者的优势于一身。
- mongo适用于以下场景:
- 网站数据:mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
- 缓存:由于性能很高,mongo也适合作为信息基础设施的缓存层。在系统重启之后,由mongo搭建的持久化缓存可以避免下层的数据源过载。
- 大尺寸、低价值的数据:使用传统的关系数据库存储一些数据时可能会比较贵,在此之前,很多程序员往往会选择传统的文件进行存储。
- 高伸缩性的场景:mongo非常适合由数十或者数百台服务器组成的数据库。
- 用于对象及JSON数据的存储:mongo的BSON数据格式非常适合文档格式化的存储及查询。
- 不适合的场景:
- 高度事物性的系统:例如银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。
- 传统的商业智能应用:针对特定问题的BI数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。
- 需要SQL的问题。
四、基础CRUD
> mongo 127.0.0.1:27017
show dbs;
use test;
// 模糊匹配
db.getCollection('CacheONUPONPort_100').find({neName:{'$regex':'\\QAN5516‐
01_10\\E'}}).limit(10);
// 过滤,排序,分页
db.getCollection('CacheOnuPonPortCollection1').find({onuSerType:'Vip'}).count();
db.getCollection('CacheOnuPonPortCollection1').find({onuSerType:'Vip'}).sort({onuId:1}).skip(100
00).limit(10);
//通过聚合函数进行过滤分页排序
db.getCollection('CacheOnuPonPortCollection1').aggregate([
{$match:{"onuSerType":"Vip"}},
{$sort:{"onuId":1}},
{$skip:0},
{$limit:10}
],{allowDiskUse:true});
db.getCollection('CacheONUPONPort').aggregate([
{$match:{"onuSvcType":"Vip"}},
{$count:"total"}
],{allowDiskUse:true});
// 插入,删除
db.user.insert({_id:1, name:'vv', age:17, phone:'15872501234', address:'wuhan'});
db.user.find({address:'wuhan'},{name:1, phone:1}).sort({age:1});
db.user.remove({_id:1});
五、高级查询
- 游标
// cursor
var cursor = db.CacheOnuPonPortCollection10.find({});
while(cursor.hasNext()){
var doc = cursor.next();
}
- 索引
// index
db.stu.getIndexes();
db.stu.ensureIndex({name:1});
- 聚合
// 聚合后求每组数量
db.CacheOnuPonPortCollection1.aggregate([
{$match:{"oltId":{"$in":[19930320]}}},
{$group:{
_id:"$oltId",
"num":{$sum:1}
}}
]);
聚合对应的java代码
// cursor
var cursor = db.CacheOnuPonPortCollection10.find({});
while(cursor.hasNext()){
var doc = cursor.next();
}
// index
db.stu.getIndexes();
db.stu.ensureIndex({name:1});
// 聚合后求每组数量
db.CacheOnuPonPortCollection1.aggregate([
{$match:{"oltId":{"$in":[19930320]}}},
{$group:{
_id:"$oltId",
"num":{$sum:1}
}}
]);
六、spring-data集成mongodb
Spring Data MongoDB配置
applicationContext-mongo.xml
为模型添加注解,实现MongoDB持久化
用于对象-文档映射的Spring Data MongoDB注解
注 解 描 述- @Document 标示映射到MongoDB文档上的领域对象
- @Id 标示某个域为ID域
- @DbRef 标示某个域要引用其他的文档,这个文档有可能位于另外一个数据库中
- @Field 为文档域指定自定义的元数据
- @Version 标示某个属性用作版本域
编写MongoDB Repository
- 扩展MongoRepository,它会继承多个方法,包括对Order文档进行CRUD操作的方法。
public interface OrderRepository extends MongoRepository
{ } - 添加自定义的查询方法
通常来讲,CRUD操作是很有用的,但我们有时候可能希望Repository提供除内置方法以外的其他方法。
Spring Data MongoDB支持方法命名约定,它能够帮助Spring Data为遵循约定的方法自动生成实现。这意味着我们可以为OrderRepository添加自定义的方法:
```
List findByCustomer(String customer);List findByCustomerLike(String customer);
List findByCustomerAndType(String customer, String type);
List getByType(String type);
```- 指定查询
@Query注解可以为Repository方法指定自定义的查询。@Query能够像在JPA中那样用在MongoDB上。唯一的区别在于针对MongoDB时,@Query会接受一个JSON查询,而不是JPA查询。例如,假设我们想要查询给定类型的订单,并且要求customer的名称
为“Chuck Wagon”。OrderRepository中如下的方法声明能够完成
所需的任务:
@Query("{customer:'Chuck Wagon'}")
List findChucksOrders();- 混合自定义的功能
定义中间接口,编写混合实现
混合实现中注入了MongoOperations(也就是MongoTemplate所实现的接口)。findOrdersByType()方法使用MongoOperations对数据库进行了查询,查找匹配条件的文档。
剩下的工作就是修改OrderRepository,让其扩展中间接口OrderOperations:
将这些关联起来的关键点在于实现类的名称为OrderRepositoryImpl。这个名字前半部分与OrderRepository相同,只是添加了“Impl”后缀。当Spring DataMongoDB生成Repository实现时,它会查找这个类并将其混合到自动生成的实现中。