文档地址: https://docs.mongodb.com/manual/
简介
说明
官方MongoDB是一个文档数据库,旨在方便应用开发和扩展
- 百度百科
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型 。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
总结: mongoDB 是一个非关系型文档数据库
历史
- 2009年2月,MongoDB数据库首次在数据库领域亮相,打破了关系型数据库一统天下的局面;
- 2010年8月, MongoDB 1.6发布。这个版本最大的一个功能就是Sharding,自动分片
- 2014年12月, MongoDB3.0发布。由于收购了WiredTiger 存储引擎,大幅提升了MongoDB的写入性能;
- 2015年12月,3.2版本发布,开始支持了关系型数据库的核心功能:关联。你可以一次同时查询多个MongoDB的集合。
- 2016年, MongoDB推出Atlas,在AWS、 Azure 和GCP上的MongoDB托管服务;
- 2017年10月,MongoDB成功在纳斯达克敲钟,成为26年来第一家以数据库产品为主要业务的上市公司。
- 2018年6月, MongoDB4.0 发布推出ACID事务支持,成为第一个支持强事务的NoSQL数据库;
2018年—至今,MongoDB已经从一个在数据库领域籍籍无名的“小透明”,变成了话题度和热度都很高的“流量”数据库。
特点
面向集合存储,易存储对象类型的数据
- 支持查询,以及动态查询
- 支持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言
- 文件存储格式为BSON(一种JSON的扩展)
- 支持复制和故障恢复和分片
- 支持事务支持
-
应用场景
游戏应用:使用云数据库MongoDB作为游戏服务器的数据库存储用户信息。用户的游戏装备、积分等直接以内嵌文档的形式存储,方便进行查询与更新。
- 物流应用:使用云数据库MongoDB存储订单信息,订单状态在运送过程中会不断更新,以云数据库MongoDB内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来,方便快捷且一目了然。
- 社交应用:使用云数据库MongoDB存储用户信息以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能。并且,云数据库MongoDB非常适合用来存储聊天记录,因为它提供了非常丰富的查询,并在写入和读取方面都相对较快。
- 视频直播:使用云数据库MongoDB存储用户信息、礼物信息等。
- 大数据应用:使用云数据库MongoDB作为大数据的云存储系统,随时进行数据提取分析,掌握行业动态。
安装
传统方式
# 1.下载 MongoDB
- https://www.mongodb.com/try/download/community
# 2.将下载安装包上传到 linux 系统
- tar -zxf mongodb-linux-aarch64-ubuntu2004-5.0.5.tgz
# 3.查看安装目录
- ls
bin
目录 用来存放启动mongoDB的服务以及客户端链接的脚本文件等
# 4.启动 MongoDB 服务
- ./mongod —port=27017 —dbpath=../data —logpath=../logs/mongo.log
--port
指定服务监听端口号 默认为 27017
--dbpath
指定 mongodb 数据存放目录 启动要求目录必须存在
--logpath
指定 mongodb 日志文件存放位置
注意: 由于指定日志文件因此启动时日志输出到日志中终端不显示任何日志
# 5.客户端连接
- ./mongo —port=27017
Docker方式
# 1.拉取 mongodb 镜像
- docker pull mongo:5.0.5
# 2.运行 mongo 镜像
- docker run -d —name mongo —p 27017:27017 mongo:5.0.5
# 3.进入 mongo 容器
- docker exec -it bc6c bash
Windows
方式一:命令行参数方式启动
在bin的同级目录下创建 data\db
在bin目录中打开命令行提示符,输入以下命令
默认端口为27017,如果想改变默认端口,可以使用mongod --dbpath=..\data\db
--port
来指定端口方式二: 配置文件方式启动服务
在解压目录中新建 config 文件夹,该文件夹中新建配置文件 mongod.conf ,内如参考如下:
详细配置项内容可以参考官方文档:https://docs.mongodb.com/manual/reference/configuration-options/storage:
#The directory where the mongod instance stores its data.Default Value is "\data\db" on Windows.
dbPath: D:\Download\mongodb-win32-x86_64-2008plus-ssl-4.0.12\data\db
【注意】
1)配置文件中如果使用双引号,比如路径地址,自动会将双引号的内容转义。如果不转义,则会报错:error-parsing-yaml-config-file-yaml-cpp-error-at-line-3-column-15-unknown-escape-character-d
解决:
a. 对 \ 换成 / 或 \
b. 如果路径中没有空格,则无需加引号。
2)配置文件中不能以Tab分割字段
解决:
将其转换成空格。
更多参数配置:mongod -f ../config/mongod.conf
或
mongod --config ../config/mongod.conf
```yaml systemLog: destination: fileThe path of the log file to which mongod or mongos should send all diagnostic logging information
path: “D:/02_Server/DBServer/mongodb-win32-x86_64-2008plus-ssl-4.0.1/log/mongod.log” logAppend: true storage: journal: enabled: trueThe directory where the mongod instance stores its data.Default Value is “/data/db”.
dbPath: “D:/02_Server/DBServer/mongodb-win32-x86_64-2008plus-ssl-4.0.1/data” net:bindIp: 127.0.0.1
port: 27017 setParameter: enableLocalhostAuthBypass: false
<a name="hquJC"></a>
## 核心概念
<a name="fbmNa"></a>
## 库<DataBase>
mongodb中的库就类似于传统关系型数据库中库的概念,用来通过不同库隔离不同应用数据。mongodb中可以建立多个数据库。每一个库都有自己的集合和权限,不同的数据库也放置在不同的文件中。默认的数据库为"test",数据库存储在启动指定的data目录中。
<a name="vcqis"></a>
### 集合<Collection>
集合就是 MongoDB 文档组,`可以理解为MySQL中表`。<br />集合存在于数据库中,一个库中可以创建多个集合。每个集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。
<a name="polxn"></a>
### 文档<Document>
文档集合中一条条记录,是一组键值(key-value)对(即 BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。
```json
{"site":"www.baizhiedu.xin", "name":"编程不良人"}
关系总结
RDBMS | MongoDB | ||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
数据库 |
数据库 |
||||||||||||||||||||||||||||||||||||||||||||||
表
库,集合<表>,文档<数据>库
删除集合
文档参考文档: https://docs.mongodb.com/manual/reference/method/ 插入文档
— 删除id为1的 db.user.remove({_id:1} )
参数说明:
如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:
对比语法如果你熟悉常规的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询: AND
ORMongoDB OR 条件语句使用了关键字 $or,语法格式如下:
AND 和 OR 联合
数组中查询
模糊查询
排序
分页
总条数
去重
指定返回字段
$type说明$type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。 使用
1、查看集合索引
2、查看集合索引大小
3、删除集合所有索引
4、删除集合指定索引
复合索引说明: 一个索引的值是由多个 key 进行维护的索引的称之为复合索引
聚合
说明MongoDB 中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似 SQL 语句中的 count(*)。 使用
现在我们通过以上集合计算每个作者所写的文章数,使用aggregate()计算结果如下:
常见聚合表达式整合应用说明: 这里主要以 springboot 应用为基础应用进行整合开发。 环境搭建
集合操作
相关注解
@Test public void testQuery(){ //基于 id 查询 template.findById(“1”,User.class); //查询所有 template.findAll(User.class); template.find(new Query(),User.class); //等值查询 template.find(Query.query(Criteria.where(“name”).is(“编程不良人”)), User.class); // > gt < lt >= gte <= lte template.find(Query.query(Criteria.where(“age”).lt(25)), User.class); template.find(Query.query(Criteria.where(“age”).gt(25)), User.class); template.find(Query.query(Criteria.where(“age”).lte(25)), User.class); template.find(Query.query(Criteria.where(“age”).gte(25)), User.class); //and template.find(Query.query(Criteria.where(“name”).is(“编程不良人”) .and(“age”).is(23)),User.class); //or Criteria criteria = new Criteria() .orOperator(Criteria.where(“name”).is(“编程不良人_1”), Criteria.where(“name”).is(“编程不良人_2”)); template.find(Query.query(criteria), User.class); //and or Criteria criteria1 = new Criteria() .and(“age”).is(23) .orOperator( Criteria.where(“name”).is(“编程不良人_1”), Criteria.where(“name”).is(“编程不良人_2”)); template.find(Query.query(criteria1), User.class); //sort 排序 Query query = new Query(); query.with(Sort.by(Sort.Order.desc(“age”)));//desc 降序 asc 升序 template.find(query, User.class); //skip limit 分页 Query queryPage = new Query(); queryPage.with(Sort.by(Sort.Order.desc(“age”)))//desc 降序 asc 升序 .skip(0) //起始条数 .limit(4); //每页显示记录数 template.find(queryPage, User.class); //count 总条数 template.count(new Query(), User.class); //distinct 去重 //参数 1:查询条件 参数 2: 去重字段 参数 3: 操作集合 参数 4: 返回类型 template.findDistinct(new Query(), “name”, User.class, String.class); //使用 json 字符串方式查询 Query query = new BasicQuery( “{$or:[{name:’编程不良人’},{name:’徐凤年’}]}”, “{name:0}”); template.find(query, User.class); }
|