MongoDB是⼀个 基于分布式⽂件存储的数据库 。由C++语⾔编写。旨在 为WEB应⽤提供可扩展⾼性能数据存储解决⽅案 。
MongoDB是⼀个 介于关系数据库和⾮关系数据库 之间的文档数据库产品,是⾮关系数据库当中功能最丰富,最像关系数据库的。他⽀持的数据结构⾮常松散,是类似json的bson格式,因此可以存储⽐较复杂的数据类型 。Mongo最⼤的特点是他⽀持的查询语⾔⾮常强⼤,其语法有点类似于⾯向对象的查询语⾔, ⼏乎可以实现类似关系数据库单表查询的绝⼤部分功能,⽽且还⽀持对数据建⽴索引
公众号 : 倔强小狮子
文章目录
1. 特点
- ⾯向集合存储,易存储对象类型的数据
- ⽀持查询,以及动态查询
- ⽀持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语⾔
- ⽂件存储格式为BSON(⼀种JSON的扩展)
- ⽀持复制和故障恢复和分⽚
- ⽀持事务⽀持(4版本之前不支持事务)
- 索引 聚合 关联…
2. 普通安装
- 下载 MongoDB MongoDB
- 解压,查看安装目录结构
- 2.1
bin
⽬录 ⽤来存放启动mongoDB的服务以及客户端链接的脚本⽂件等 - 2.2 启动 MongoDB MongoDB 服务
./mongod --port=27017 --dbpath=../data --logpath=../logs/mongo.log
--port
指定服务监听端⼝号 默认为 27017
--dbpath
指定 mongodb 数据存放⽬录 启动要求⽬录必须存在
--logpath
指定 mongodb ⽇志⽂件存放位置 - 2.3 客户端连接
./mongo --port=27017
3 Docker 安装
- 拉取 mongodb mongodb 镜像
docker pull mongo:5.0.5
- 运⾏ mongo mongo 镜像
docker run -d --name mongo --p 27017:27017 mongo:5.0.5
- 进入mongo 容器
docker exec -it bc6192dcddg3s91dzw bash
4. 核心概念
4.1 库
- mongodb中的库就类似于传统关系型数据库中库的概念,⽤来通过不同库隔离不同应⽤数据 。
- mongodb中可以建⽴多个数据库。
- 每⼀个库都有⾃⼰的集合和权限,不同的数据库也放置在不同的⽂件中。
- 默认的数据库为"test",数据库存储在启动指定的data⽬录中。
4.2 集合
- 集合就是 MongoDB ⽂档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表的概念 。
- 集合存在于数据库中,⼀个库中可以创建多个集合。
- 每个集合没有固定的结构,这意味着你在对集合可以插⼊不同格式和类型的数据,但通常情况下我们插⼊集合的数据都会有⼀定的关联性。
4.3 文档
- ⽂档集合中⼀条条记录,是⼀组键值(key-value)对(即 BSON)。
- MongoDB 的⽂档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很⼤的区别,也是 MongoDB ⾮常突出的特点。
- ⼀个简单的⽂档例⼦如下:
{"addr":"www.baidu.com", "name":"百度网站"}
4.4 关系总结
RDBMS数据库 | MongoDB数据 |
---|---|
数据库 | 数据库 |
表 集合 | |
行 | 文档 |
列 | 字段 |
5. 核心操作
5.1 库
-
查看所有库
show databases; | show dbs;
PS 注意:
- admin : 从权限的⻆度来看,这是"root"数据库。要是将⼀个⽤户添加到这个数据库,这个⽤户⾃动
继承所有数据库的权限。⼀些特定的服务器端命令也只能从这个数据库运⾏,⽐如列出所有的数据库
或者关闭服务器。 - local : 这个数据永远不会被复制,可以⽤来存储限于本地单台服务器的任意集合
- config : 当Mongo⽤于分⽚设置时,config数据库在内部使⽤,⽤于保存分⽚的相关信息
- admin : 从权限的⻆度来看,这是"root"数据库。要是将⼀个⽤户添加到这个数据库,这个⽤户⾃动
-
创建数据库
use 库名
PS 注意: use 代表创建并使⽤,当库中没有数据时默认不显示这个库
-
使用数据库并插入一条数据
db.users.insert({"addr":"www.baidu.com","name":"百度网站"});
-
删除数据库
- db.dropDatabase();
- db.dropDatabase();
6 集合
- 查看所有集合
show collections; | show tables;
- 创建集合
db.createCollection('集合名称', [options])
PS 注意:当集合不存在时,向集合中插⼊⽂档也会⾃动创建该集合
- 删除集合
db.集合名称.drop();
7. ⽂档
- 插⼊⽂档
-
单条⽂档
db.集合名称.insert({"addr":"www.baidu.com","name":"百度网站"});
-
多条⽂档
db.集合名称.insert([{"addr":"www.baidu.com","name":"百度网站"},{"addr":"https://spring.io/","name":"Spring官网"}]);
-
查询所有
db.集合名称.find();
-
删除⽂档
db.集合名称.remove( <query>, { justOne: <boolean>, writeConcern: <document> } )
-
参数说明:
- query : 可选 删除的⽂档的条件。
- justOne : 可选 如果设为 true 或 1,则只删除⼀个⽂档,如果不设置该参数,或使⽤默认值 false,则删除所有匹配条件的⽂档。
- writeConcern : 可选 抛出异常的级别
注意:在 mongodb 中每个⽂档都会有⼀个_id作为唯⼀标识,_id默认会⾃动⽣成如果⼿动指定将使⽤⼿动指定的值作为_id 的值。
-
更新⽂档
db.集合名称.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } );
-
参数说明:
- query : update的查询条件,类似sql update查询内where后⾯的。
- update : update的对象和⼀些更新的操作符(如 , , ,inc…)等,也可以理解为sql update查询内set后⾯的
- upsert : 可选 ,这个参数的意思是,如果不存在update的记录,是否插⼊objNew,true为插⼊,默认是false,不插⼊。
- multi : 可选 ,mongodb 默认是false,只更新找到的第⼀条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
- writeConcern : 可选 ,抛出异常的级别
-
db.集合名称.update({“name”:“张三”},{name:“李四”,bir:new date()})
这个更新是将符合条件的全部更新成后⾯的⽂档,相当于先删除在更新
-
db.集合名称.update({“name”:“张三”},{$set:{name:“李四”}})
保留原来数据更新,但是只更新符合条件的第⼀条数据
-
db.集合名称.update({name:”张三”},{$set:{name:”⼩明”}},{multi:true})
保留原来数据更新,更新符合条件的所有数据
-
db.集合名称.update({name:”张三”},{$set:{name:”⼩明”}},{multi:true,upsert:true})
`保留原来数据更新,更新符合条件的所有数据 没有条件符合时插⼊数据
-
8.⽂档查询
MongoDB 查询⽂档使⽤ find() ⽅法。find() ⽅法以⾮结构化的⽅式来显示所有⽂档。
- 语法
db.集合名称.find(query, projection)
- query :可选,使⽤查询操作符指定查询条件
- projection :可选,使⽤投影操作符指定返回的键。查询时返回⽂档中所有键值, 只需省略该参数即可
(默认省略)
- 如果你需要以易读的⽅式来读取数据,可以使⽤ pretty() ⽅法,语法格式如下:
db.集合名称.find().pretty()
注意: pretty() ⽅法以格式化的⽅式来显示所有⽂档
- 对⽐语法
操作 | 格式 | 范例 | RDBMS类似语句 |
---|---|---|---|
等于 | { < key > : < value > } | db.col.find({“name”:“张三”}).pretty() | where name=“张三” |
小于 | { < key > { $lt: < value > } } | db.col.find({“age”:"$lt:18"}).pretty() | where age < 18 |
小于或等于 | { < key > : { $lte: < value > } } | db.col.find({“age”:"$lte:18"}).pretty() | where age <= 18 |
大于 | { < key > : { $gt: < value > }} | db.col.find({“age”:"$gt:18"}).pretty() | where age > 18 |
大于或等于 | { < key > : { $gte: < value > } } | db.col.find({“age”:"$gte:18"}).pretty() | where age >= 18 |
不等于 | {< key >: { $ne: < value > } } | db.col.find({“age”:"$ne:18"}).pretty() | where age != 18 |
-
AND
db.集合名称.find({key1:value1, key2:value2,...}).pretty()
类似于 WHERE 语句:WHERE key1=value1 AND key2=value2
-
OR
db.集合名称.find( { $or: [ {key1: value1}, {key2:value2} ] } ).pretty()
类似于 WHERE 语句:WHERE key1=value1 or key2=value2
-
AND 和 OR 联合
类似SQL语句为:'where age >50 AND (name = '编程不良⼈' OR name = 'MongoDB')'
db.集合名称.find({"age": {$gt:50}, $or: [{"name": "编程不良⼈"},{"name": "MongoDB"}]}).pretty();
-
数组中查询
- 测试数据
db.集合名称.insert({ "_id" : 11, "age" : 29, "likes" : [ "看电视", "读书xx" ], "name" : "张三_11" })
- 执⾏数组查询
db.users.find({likes:"看电视"})
- $ size 按照数组⻓度查询
db.users.find({likes:{$size:3}});
- 测试数据
-
模糊查询
类似 SQL 中为 'where name like '%name%''
db.users.find({likes:/张/});
注意:在 mongoDB 中使⽤正则表达式可以是实现近似模糊查询功能
-
排序
db.集合名称.find().sort({name:1,age:1})
1 升序 -1 降序
类似 SQL 语句为: 'order by name,age'
-
分⻚
db.集合名称.find().sort({条件}).skip(start).limit(rows);
类似于 SQL 语句为: 'limit start,rows'
-
总条数
db.集合名称.count();
db.集合名称.find({"name":"张三"}).count();
类似于 SQL 语句为: 'select count(id) from ....'
-
去重
db.集合名称.distinct('字段')
类似于 SQL 语句为: 'select distinct name from ....'
-
$type
- $type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。
-
MongoDB 中可以使⽤的类型如下表所示:
类型 | 数字 | 备注 |
---|---|---|
Double | 1 | |
String | 2 | |
Object | 3 | |
Array | 4 | |
Binary data | 5 | |
Undefined | 6 | 废弃 |
Object id | 7 | |
Boolean | 8 | |
Date | 9 | |
Null | 10 | |
Regular Expression | 11 | |
JavaScript | 13 | |
Symbol | 14 | |
JavaScript(with scope) | 15 | |
32-bit integer | 16 | |
Timestamp | 17 | |
64-bit integer | 18 | |
Min key | 255 | |
Max key | 127 |
-
使⽤
db.col.insert({ title: 'java 教程', description: "Java语言', by: '开发', url: 'http://spring.io', tags: ['java'], likes: 200 });
db.col.insert({ title: 'Java 教程', description: 'Java 是由Sun Microsystems公司于1995年5⽉推出的⾼级程序设计语⾔。', by: '编程不良⼈', url: 'http://www.baizhiedu.xin', tags: ['java'], likes: 550 });
db.col.insert({ title: 'MongoDB 教程', description: 'MongoDB 是⼀个 Nosql 数据库', by: '编程不良⼈', url: 'http://www.baizhiedu.xin', tags: ['mongodb'], likes: 100 });
-
如果想获取 “col” 集合中 title 为 String 的数据,你可以使⽤以下命令:
db.col.find({"title" : {$type : 2}}).pretty(); 或 db.col.find({"title" : {$type : 'string'}}).pretty();
-
如果想获取 “col” 集合中 tags 为 Array 的数据,你可以使⽤以下命令:
db.col.find({"tags" : {$type : 'array'}}).pretty();
-
期待你的关注,和我一起学习
转载说明:转载携带原文链接