文章目录
一.简介
- mongodb属于NoSQL的一种分布式文档型存储数据库.
- 由c++编写介于NoSQL和SQL之间.是最像SQL的非关系型数据库. 也具备ACID能力
- 底层是JSON格式的二进制存储.称BSON.
- Mongo最大的特点是它支持的查询语言非常强大
特点
- 高性能
MongoDB提供高性能的数据持久性。特别是,对嵌入式数据模型的支持减少了数据库系统上I/O活动。索引支持更快的查询,并且可以包含来自嵌入式文档和数组的键。(文本索引解决搜索的需求、TTL索引解决历史数据自动过期的需求、地理位置索引可用于构建各种O2O应用)mmapv1、 wiredtiger、 mongorocks( rocks)、 In-memory等多引擎支持满足各种场景需求Gridfs解决文件存储的需求 - 高可用性
MongoDB的复制工具称为副本集( replica set),它可提供自动故障转移和数据冗余 - 高扩展性
MongoDB提供了水平可扩展性作为其核心功能的一部分。分片将数据分布在一组集群的机器上。(海量数据存储,服务能力水平扩展)从3.4开始,MoηgoDB支持基于片键创建数据区域。在一个平衡的集群中, MongoDB将一个区域所覆盖的读写只定向到该区域内的那些片。 - 丰富的查询支持
MongoDB支持丰富的査询语言,支持读和写操作(CRUD),比如数据聚合、文本搜索和地理空间查询等 - 其他特点
如无模式(动态模式)、灵活的文档模型
二.docker安装 与 yum安装
默认占内存的一半
2.1 docker安装
docker pull mongo:latest
# -p 27017:27017 :映射容器服务的 27017 端口到宿主机的 27017 端口。外部可以直接通过 宿主机 ip:27017 访问到 mongo 的服务。
# --auth:需要密码才能访问容器服务。
docker run -d \
-p 27017:27017 \
--restart=always \
--privileged=true \
-v mongo_configdb:/data/configdb \
-v mongo_db:/data/db --name mongo docker.io/mongo --auth
docker exec -it mongo mongo admin
# MongoDB 6.0 及以上版本使用以下命令
docker exec -it mongo mongosh admin
# 创建一个名为 admin,密码为 123456 的用户
db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]});
# 尝试使用上面创建的用户信息进行连接。
db.auth('admin', '123456');
2.2 yum安装
# 1、下载
$ wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.9.tgz
# 2、解压
$ tar -zxvf mongodb-linux-x86_64-4.0.9.tgz
# 3、改名,放到目录:/usr/local
$ mv mongodb-linux-x86_64-4.0.9 /usr/local/mongodb
# 4、新建必要的文件夹(依次是:数据库 日志 配置文件)
$ cd /usr/local/mongodb
$ mkdir data log etc
# 5、添加系统路径
$ vim /etc/profile
export PATH=$PATH:/usr/local/mongodb/bin
# 6、配置生效
$ source /etc/profile
# 7、查看是否添加
$ echo $PATH
# 或者做软链
ln -s /usr/local/mongodb/bin/mongo /usr/bin/mongo
# 配置文件
$ vim etc/mongodb.conf
###############配置内容###############
storage:
dbPath: /usr/local/mongodb/data #db存放目录
engine: wiredTiger # 存储引擎
journal: # 是否启用日志
enabled: true
systemLog:
destination: file
logAppend: true
path: /usr/local/mongodb/log/mongodb.log #日志输出目录
net:
port: 27017 #端口
bindIp: 127.0.0.1
processManagement:
fork: true #后台启动
###############配置内容###############
启动服务
# 启动服务
mongod --config /usr/local/mongodb/etc/mongodb.conf
# 关闭服务
mongod --config /usr/local/mongodb/etc/mongodb.conf --shutdown
# 或者
killall mongod
外网访问和权限
添加用户
数据库认证登录
mongo -u username -p password --authenticationDataBase=database
# 本地连接
$ mongo
# 添加用户
> use admin
switched to db admin
# 添加管理员用户
> db.createUser({user: "admin",pwd: "123456",roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]});
# 添加超级用户
> db.createUser({user: "root",pwd: "123456",roles: [ { role: "root", db: "admin" } ]});
# 查看已有用户
> show users
# 删除单个用户
> db.system.users.remove({user:"XXXXXX"})
# 关闭服务
> db.shutdownServer()
修改配置
# 配置文件
$ vim etc/mongodb.conf
storage:
dbPath: /usr/local/mongodb/data
journal:
enabled: true
systemLog:
destination: file
logAppend: true
path: /usr/local/mongodb/log/mongodb.log
net:
port: 27017
bindIp: 0.0.0.0
processManagement:
fork: true #后台启动
security:
authorization: enabled
放开MongoDB所使用的端口,并启动服务,进行验证
# 关闭服务
mongod --config /usr/local/mongodb/etc/mongodb.conf --shutdown
# 授权模式启动服务
mongod --config /usr/local/mongodb/etc/mongodb.conf --auth
# 本地连接 - 连接时验证
$ mongo -u username -p password
# 远程连接 - 连接时验证
$ mongo 127.0.0.1/admin -u username -p password
# 远程连接 - 连接后验证
$ mongo 127.0.0.1/admin
> use admin
switched to db admin
> db.auth("username", "password")
# 修改密码
use admin
db.changeUserPassword('用户','密码')
三.命令介绍
3.1集合操作
# 查看集合
show collections
# 创建集合
db.createCollection("user_collection")
# 删除集合
db.user_collection.drop()
创建集合语法扩展
db.createCollection(name,options)
适用场景: 生产者消费者. 日志覆写
字段 | 类型 | options字段描述 |
---|---|---|
capped | boolean | (可选)如果为tue,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早 |
的文档. | ||
size | number | (可选) 为固定集合指定一个最大值(字节单位),如果capped为true,也需要指定该字段 |
max | number | (可选) 指定固定集合种包含文档的最大数量 |
3.2 插入操作
show dbs
use test
/*插入一条数据*/
db.user.insertOne({"name":"张三","age":"21"})
/*插入多条数据*/
db.book.insertMany([{"bookName":"哈利波特"},
{"bookName":"风"}])
/*执行js脚本*/
load("book.js")
3.3 查询操作
语法格式: db.collection.find(query,projection)
- query 可选,使用查询操作符指定查询条件
- projection 可选,使用投影操作符指定返回的键。查询时返回文档中所有键值,只需省略该参数即可(默认省略)。投影时,id为1的时候,其他字段必须是1;id是0的时候,其他字段可以是0;如果没有_id字段约束,多个其他字段必须同为0或同为1。
条件查询
/*插入一条数据*/
db.user.insertOne({"name":"张三","age":"21"})
/*插入多条数据*/
db.book.insertMany([
{"bookName":"哈利波特","id":"1","type":"魔法"},
{"bookName":"风","id":"2","type":"魔法"},
{"bookName":"爱","id":"3","type":"爱情"}])
/*查询数据*/
db.user.find()
db.book.find()
db.user.find({"age":"21"})
db.book.find({"type":"魔法"})
db.book.findOne({"type":"魔法"})
// 上面定义的是字符串类型,不能用数值. 查找包含id 1 2 3 的
db.book.find({"id":{$in:["1","2","3"]}})
// 上面定义的是字符串类型,不能用数值. 查找id小于等于2的
db.book.find({"id":{$lte:"2"}})
// 根据id降序
db.book.find().sort({"id": -1})
// 正则表达式查询
db.book.find({"type":{$regex:"魔"}})
// 分页查询 skip跳过的数据条数 limit限制返回条数
db.book.find().skip((currentPage-1)*size).limit(size)
3. 4 更新文档
语法格式: db.collection.update(query,update,options)
- query:描述更新的查询条件
- update:描述更新的动作及新的内容;
- options:描述更新的选项
- upsert:可选,如果不存在update的记录,是否插入新的记录。默认false,不插入
- multi:可选,是否按条件查询出的多条记录全部更新。默认false,只更新找到的第
条记录 - writeConcern :可选,决定一个写操作落到多少个节点上才算成功。
/*插入多条数据*/
db.book.insertMany([
{"bookName":"哈利波特","id":1,"type":"魔法","number":100},
{"bookName":"风","id":2,"type":"魔法","number":1024},
{"bookName":"爱","id":3,"type":"爱情","number":100}])
// 找到id为1的数据.让number属性自增1 第一个参数为查询条件,第二个参数为修改内容
db.book.updateOne({"id":1},{$inc:{"number":1}})
db.book.find({"id":1})
// 更新一条新值
db.book.updateOne({"id":2},{$set:{"bookName":"西游记"}})
db.book.find({"id":2})
repalace全文档替换.一条数据全部被覆盖
默认情况下,findAndModify会返回修改前的“旧”数据。如果希望返回修改后的数据,则可以指定new选
项
3.5 删除文档
- remove 命令需要配合查询条件使用;
- 匹配查询条件的文档会被删除;
- 指定一个空文档条件会删除所有文档;
- 推荐db.book.deleteOne(),db.book.deleteMany()
db.book.deleteOne({"id":2})
db.book.deleteMany({"type":"魔法"})
db.book.deleteMany({"id":{$lt:2}}) // 删除id小于2的
db.book.deleteMany({}) // 删除所有行记录
db.book.deleteMany() //报错
3.6 文档聚合
#检索books集合中所有文档的计数
# db.collection.estimatedDocumentCount() 不使用查询过滤器,而是使用元数据返回集合的计数。
db.books.estimatedDocumentCount()
#计算与查询匹配的所有文档
#它执行文档的聚合以返回准确的计数,即使在异常关闭后或分片群集中存在孤立的文档之后也是如此。
db.books.countDocumentCount({favCount:{$gt:50}})
#返回不同type的数组
db.books.distinct("type")
#返回收藏数大于90的文档不同type的数组
db.books.distinct("type",{favCount:{$gt:90}})
注意:
聚合练习题前往此处
四.SpringBoot集成Mongodb
引入pom依赖
<!--spring data mongodb-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
spring:
data:
mongodb:
uri: mongodb://admin:123456@localhost:27017/test?authSource=admin
#uri等同于下面的配置
#database: test
#host: localhost
#port: 27017
#username: admin
#password: 123456
#authentication-database: admin
使用时注入mongoTemplate
@Autowired
MongoTemplate mongoTemplate;
@Test
public void testCollection(){
boolean exists = mongoTemplate.collectionExists("emp");
if (exists) {
//删除集合
mongoTemplate.dropCollection("emp");
}
//创建集合
mongoTemplate.createCollection("emp");
}