MongoDB是一个跨平台、面向文档的数据库,是当前NoSQL中最热门的一种。它介于关系型和非关系型数据库之间,是非关系型数据库中:功能最丰富、最像关系型数据库的产品。它支持的数据结构非常松散,是类似Json的Bson格式,因此可以存储较为复杂的数据。
MongoDB初识
1. 简介
MongoDB是一个跨平台、面向文档的数据库,是当前NoSQL中最热门的一种。它介于关系型和非关系型数据库之间,是非关系型数据库中:功能最丰富、最像关系型数据库的产品。它支持的数据结构非常松散,是类似Json的Bson格式,因此可以存储较为复杂的数据。
MongoDB官网: https://www.mongodb.com/
1. 特点
MongoDB最大特点是:支持的查询语言非常强大,语法类似面向对象的查询语句,几乎可以实现所有关系型数据库单表查询的绝大部分功能,而且还支持对数据库建立索引。MongoDB是面向集合的,模式自由的文档型数据库。
1)面向集合存储,易于存储对象型数据
2)模式自由
3)支持动态查询
4)支持完全索引,包含内部对象
5)支持复制和故障恢复
6)使用高效的二进制数据存储,包括大型对象(比如视频等)
7)支持Python、PHP、Java、Ruby、C、C#、JS等语言的驱动程序。
8)文件存储格式为BSON(JSON的扩展)
2. 体系结构
MongoDB的逻辑结构是一种层次结构,由Document、Collection、Database三部分组成,逻辑结构是面向用户的。
1)Document:相当关系型数据库表的一行记录。
2)Collection:相当于关系型数据库的一张表,可以存储多个Document。
3)Database:相当于关系型数据库的一个数据库,可以存储多个Collection。
3. 数据类型
数据类型 | 特点 | 示例 |
---|---|---|
null | 空值、或不存在的值 | {“x”:nul} |
布尔型 | true、false | {“x”:true} |
数值 | 默认使用64浮点型,NumberInt可以定义使用整型 | {“x”:NumberInt(1)} |
字符串 | UTF-8 | {“x”:”呵呵”} |
日期 | 毫秒数,不存储时区 | {“x”:new Date()} |
正则表达式 | 查询时,可以作为条件 | {“x”:/[abc]/} |
数组 | 类别Java | {“x”:[“a”,”b”]} |
内嵌对象 | 文档内可以嵌套其他文档对象 | {“x”:{“y”:3}} |
对象id | 12字节字符串,文档的唯一标识 | {“x”:objectId()} |
二进制数据 | 非UTF-8数据 | |
代码 | 查询和文档中可以包含任何JS代码 | {“x”:function(){…}} |
2. MongoDB简单使用
1. 安装【Windows】
1)下载安装文件
2)安装在指定目录
3)将该目录添加到环境变量中
https://docs.mongodb.com/manual/tutorial/install-mongodb-on-windows/
2. 启动
1)新建cmd窗口
2)使用mongod设置数据库存放目录
1 | 创建目录 |
2)输入mongo,进入mongoDB中
3)输入exit,退出
3. Docker下安装MongoDB
拉取镜像
1
2
3
4搜索镜像
docker search mongo
拉取镜像
docker pull mongo创建容器
1
2守护式方式创建容器
docker run -di --name=my_mongodb -p 27017:27017 mongo远程登录
我们之前安装的MongoDB既是服务器端,也是客户端,因此我们使用windows下的远程连接部署在docker上的。
1
mongo [docker宿主机IP地址]
4. 常用命令
在使用客户端连上了docker的mongoDB之后,我们使用起来学习常用命令。
选择和创建数据库
1
use [数据库名称]
与MySQL不同,MongoDB下,当指定的数据库名称不存在,则会自动创建一个数据库。
插入与查询文档
1
2
3
4插入文档
db.[集合名称].insert(数据);
查询所有文档
db.[集合名称].find();演示
1
2
3
4
5
6
7
8创建msgdb数据库
use msgdb
插入文档信息 包含:context,name
db.msg.insert({content:"你好啊,MongoDB!",name:"tobing")});
查询所有,查看是否插入成功
db.msg.find();查询结果
1
{ "_id" : ObjectId("5f1289f78d22f2d94c6e42de"), "content" : "你好啊,MongoDB,这是一句话", "username" : "tobing" }
观察查询结果我们发现,文档中多了一条**”_id”的字段,这相当于关系型数据库中的主键**。
当插入文档时没有注定,MongoDB会帮我们自动创建,类型为ObjectID类型。
我们插入时也可以指定,可以是ObjectID类型或者MongoDB支持的任意类型。
1
2
3
4
5
6
7
8
9
10
11添加第二条记录
db.spit.insert({"_id":"1",content:"你好啊,赤橙梦魇过","username":"zenyet"})
再次查询所有
db.spit.find()
查询一个:查询_id为1的数据
db.spit.findOne({"_id":"1"})
查询前n条记录
db.spit.find().limit(3)1
2
3
4
5
6查询所有
{ "_id" : ObjectId("5f1289f78d22f2d94c6e42de"), "content" : "你好啊,MongoDB,这是一句话", "username" : "tobing" }
{ "_id" : "1", "content" : "你好啊,赤橙梦魇过", "username" : "zenyet" }
查询一个
{ "_id" : "1", "content" : "你好啊,赤橙梦魇过", "username" : "zenyet" }修改和删除文档
修改
1
db.集合名称.update(条件,修改的数据)
删除
1
db.集合名称.remove(条件)
示例
1
2
3
4更新_id为1的content
db.spit.update({"_id":"1"},{$set:{content:"Hello, This is new !"}})
删除_id为1的文档
db.spit.remove({"_id":"1"})注意:当不加上
$set
的时候,会将符合条件的记录的其他字段全部清空。统计条数
1
2
3
4统计所有
dp.spit.count()
统计符合条件
dp.spit.count(条件)模糊查询
MongoDB的模糊查询通过正则表达式方式实现的。格式为:/模糊查询字符串/
1
2
3
4查询所有content字段包含tobing的文档
db.spit.find({content:/流量/})
查询所有content字段以流量开头的文档
db.spit.find({content:/^流量/})比较运算符
<、>、<=、>=操作
1
2
3
4
5db.集合名称.find({"Field":{$gt:value}}) // 大于:field > value
db.集合名称.find({"Field":{$lt:value}}) // 小于:field < value
db.集合名称.find({"Field":{$gte:value}}) // 大于等于:field >= value
db.集合名称.find({"Field":{$lte:value}}) // 小于等于:field <= value
db.集合名称.find({"Field":{$ne:value}}) // 不等于:field != value包含与不包含
1
2
3
4查询id包含101,102的文档
db.spit.find({id:{$in:["101","102"]}})
查询不包含的
db.spit.find({id:{$nin:["101","102"]}})条件连接
需要查询同时满足两个条件的时候,使用and
需要查询满足其中一个条件的时候,用or
1
2
3and:[{},{},{}]
or:[{},{},...]1
2
3
4查询符合id=1且name="tobing"的文档
db.spit.find({$and:[{"id":1},{"name":"tobing"}]})
查询符合id=1或name="tobing"的文档
db.spit.find({$or:[{"id":1},{"name":"tobing"}]})列值增长
可以使用
$inc运算符
对原有的值进行增加或减少1
db.spit.udpate({_id:"2"},{$inc:{visits:NumberInt(1)}})
3. Java操作MongoDB
1. 创建maven、导入依赖坐标
1 | <dependency> |
2. 创建测试类
1 | package top.tobing.test; |