MongoDB-springboot

目录

官方文档

linux 安装

安装

修改解释器 

 修改文件权限

修改配置文件

切换到 mongod 用户启动服务 

验证

操作数据库

SQL操作

新增

查询 

修改 

删除

索引

文档之间的关系

sq操作整合 

js操作

密码验证

mongodb附件

文件列表

文件信息 

文件存储位置

springboot整合mongodb

源码地址


官方文档

mongodb数据库的稳定版本为 偶数版,只要能被2 整除,就是稳定版,例如1.2,2.2,3.2 

官网下载地址:  https://www.mongodb.com/try/download/community?tck=docs_server

可以选择,windows ,可以选择linux ,

在安装 windows 的版本的时候,出现问题,一直卡在哪里了一个晚上都没有安装成功,不知道什么原因,

后面转为 linux 进行安装

windows上安装 mongodb 服务器,服务自动启动 

https://docs.mongodb.com/manual/tutorial/

 

 

linux 安装

官网下载地址:  https://www.mongodb.com/try/download/community?tck=docs_server

下载 rpm 安装包

安装

 

修改解释器 

安装完之后,会自动创建 mongod 用户 

修改mongod用户的命令的解释器

 修改文件权限

查看 /var/lib/mongo 文件夹是否存在,如果存在该文件夹的属主,属组都是 root 用户,则进行修改

chown -R mongod:mongod /var/lib/mongo

 查看/var/log/mongodb 文件夹是否存在,如果存在该文件夹的属主,属组都是 root 用户,则进行修改

chown -R mongod:mongod /var/log/mongodb

修改配置文件

 vim /etc/mongod.conf 

bindIP:修改为 0.0.0.0 允许任何ip进行连接 

切换到 mongod 用户启动服务 

su mongod

启动mongod.service

systemctl start mongod.service

password 输入的是,admin 的用户的密码,或者 root 用户的密码 

  

验证

通过Navicat进行连接,验证是否成功 

连接工具的话可以使用: nosql 工具(推荐使用,可以看到附件的信息),studio工具 

 

 

操作数据库

官方文档: https://docs.mongodb.com/manual/tutorial/insert-documents/

三个概念
数据库(database)
数据库是一个仓库,在仓库中可以存放集合。
集合(collection)等价于表
集合类似于数组,在集合中可以存放文档。
文档(document)相当于数据
文档数据库中的最小单位,我们存储和操作的内容都是文档

 

一个数据库 = N个集合 = N*N个文档

- 基本概念
    数据库(database)
    集合(collection)
    文档(document)
        - 在MongoDB中,数据库和集合都不需要手动创建,
            当我们创建文档时,如果文档所在的集合或数据库不存在会自动创建数据库和集合
 

官方文档: https://docs.mongodb.com/manual/crud/

 

// 切换数据库(相当于创建一个数据库)

// 在MongoDB中,数据库和集合都不需要手动创建,当我们创建文档时,如果文档所在的集合或数据库不存在会自动创建数据库和集合
use stus

插入数据(xiyouji 相当于在数据库中的表)

//例子:向 stus 数据库中的,xiyouji集合中插入一个新的学生对象
db.xiyouji.insert({name:"孙悟空",age:18,gender:"男"})

查询全部数据

// 查询全部数据
db.xiyouji.find();

 

SQL操作

操作的前提是,选中某一个数据库,或者使用连接工具手动创建一个数据库

新增

/*
    向数据库插入文档
        db.<collection>.insert()
        - 向集合中插入一个或多个文档
        - 当我们向集合中插入文档时,如果没有给文档指定_id属性,则数据库会自动为文档添加_id
            该属性用来作为文档的唯一标识
        - _id我们可以自己指定,如果我们指定了数据库就不会在添加了,如果自己指定_id 也必须确保它的唯一性
        
    db.collection.insertOne()
        - 插入一个文档对象
    db.collection.insertMany() 
        - 插入多个文档对象
*/
db.stus.insert({name:"猪八戒",age:28,gender:"男"});

db.stus.insert([
    {name:"沙和尚",age:38,gender:"男"},
    {name:"白骨精",age:16,gender:"女"},
    {name:"蜘蛛精",age:14,gender:"女"}
]);

//手动指定id,要保证id的唯一性
db.stus.insert({_id:"hello",name:"猪八戒",age:28,gender:"男"});

//查询数据
db.stus.find();

//生成文档id
ObjectId()

查询 

/*
    查询
        db.collection.find()
        - find()用来查询集合中所有符合条件的文档
        - find()可以接收一个对象作为条件参数
            {} 表示查询集合中所有的文档
            {属性:值} 查询属性是指定值的文档
        - find()返回的是一个数组
            
        db.collection.findOne()
        - 用来查询集合中符合条件的第一个文档  
        - findOne()返回的是一个文档对象 
       
       db.collection.find({}).count() 
        - 查询所有结果的数量
*/
db.stus.find({_id:"hello"});
db.stus.find({age:16 , name:"白骨精"});
db.stus.find({age:28});
db.stus.findOne({age:28});
db.stus.findOne({age:28}).name;

db.stus.find({}).count();
db.stus.find({}).length();

修改 

/*
    修改
     db.collection.update(查询条件,新对象)
        - update()默认情况下会使用新对象来替换旧的对象
        - 如果需要修改指定的属性,而不是替换需要使用“修改操作符”来完成修改
            $set 可以用来修改文档中的指定属性
            $unset 可以用来删除文档的指定属性, 要删除的属性的值可以随意指定不影响
        - update()默认只会修改一个
            
        db.collection.updateMany()
        - 同时修改多个符合条件的文档
   
        db.collection.updateOne()
        - 修改一个符合条件的文档    
        
        db.collection.replaceOne()
        - 替换一个文档
*/
db.stus.find({});

//替换
db.stus.update({name:"沙和尚"},{age:28});

db.stus.update(
    {"_id" : ObjectId("59c219689410bc1dbecc0709")},
    {$set:{
        gender:"男",
        address:"流沙河"
    }}    
)

db.stus.update(
    {"_id" : ObjectId("59c219689410bc1dbecc0709")},
    {$unset:{
        address:1
    }}    
)

db.stus.updateMany(
    {"name" : "猪八戒"},
    {
        $set:{
            address:"猪老庄"
        }
    }    
);

// update 默认修改第一个,使用multi表示修改多个
db.stus.update(
    {"name" : "猪八戒"},
    
    {
        $set:{
        address:"呵呵呵"
        }
    }  ,
    {
        multi:true
    }    
)

db.stus.find()

删除

/*
    db.collection.remove()
        - 删除一个或多个,可以第二个参数传递一个true,则只会删除一个
        - 如果传递一个空对象作为参数,则会删除所有的
    db.collection.deleteOne()
    db.collection.deleteMany()
    db.collection.drop() 删除集合
    db.dropDatabase() 删除数据库
    
        - 一般数据库中的数据都不会删除,所以删除的方法很少调用
          一般会在数据中添加一个字段,来表示数据是否被删除
*/

//remove删除符合条件的所有文档
db.stus.remove({_id:"hello"});
db.stus.remove({age:18});

//传递第二个参数,为true,表示只删除第一个匹配的文档
db.stus.remove({age:18}, true);

//删除全部的数据,如果传递的是空对象,性能差(需要先匹配数据,然后进行删除)
db.stus.remove({});

//查看所有集合
show collections;

//删除集合
db.stus.drop();
        
db.stus.insert([
    
    {
        name:"zbj",
        isDel:0
        },
        {
        name:"shs",
        isDel:0
        },
    {
    name:"ts",
        isDel:0
    }

]);

db.stus.updateOne({name:"ts"},{$set:{isDel:1}});
    
db.stus.find({isDel:0})    

 

索引

注意在 3.0.0 版本前创建索引方法为 db.collection.ensureIndex(),之后的版本使用了 db.collection.createIndex() 方法,ensureIndex() 还能用,但只是 createIndex() 的别名。

-- name按照升序创建索引
db.stus.createIndex({"name":1})

-- 复合索引, id按照升序创建,name按照降序创建
db.stus.createIndex({"id":1,"name":-1})

-- 查看集合索引
db.stus.getIndexes()

-- 查看集合索引大小
db.stus.totalIndexSize()

-- 删除集合所有索引
db.stus.dropIndexes()

-- 删除集合指定索引
db.stus.dropIndex("索引名称")

 

文档之间的关系

/*
  文档之间的关系
    一对一(one to one)
        - 夫妻 (一个丈夫 对应 一个妻子)
        - 在MongoDB,可以通过内嵌文档的形式来体现出一对一的关系
    
    一对多(one to many)/多对一(many to one)
        - 父母 - 孩子
          用户 - 订单
          文章 - 评论
          - 也可以通过内嵌文档来映射一对多的关系
          
    
    多对多(many to many)
       - 分类 - 商品
         老师 - 学生 
    
*/
db.wifeAndHusband.insert([
    {
        name:"黄蓉",
        husband:{
            name:"郭靖"
        }
    },{
        name:"潘金莲",
        husband:{
            name:"武大郎"
        }
    }

]);

db.wifeAndHusband.find();


//一对多 用户(users) 和 订单(orders)
db.users.insert([{
    username:"swk"
    },{
    username:"zbj"
}]);

db.order.insert({
    
    list:["牛肉","漫画"],
    user_id: ObjectId("59c47e35241d8d36a1d50de0")
    
});

db.users.find()
db.order.find()

//查找用户swk的订单
var user_id = db.users.findOne({username:"zbj"})._id;
db.order.find({user_id:user_id});

//多对多
db.teachers.insert([
    {name:"洪七公"},
    {name:"黄药师"},
    {name:"龟仙人"}
]);

db.stus.insert([
    {
        name:"郭靖",
        tech_ids:[
            ObjectId("59c4806d241d8d36a1d50de4"),
            ObjectId("59c4806d241d8d36a1d50de5")
        ]
    },{
        name:"孙悟空",
        tech_ids:[
            ObjectId("59c4806d241d8d36a1d50de4"),
            ObjectId("59c4806d241d8d36a1d50de5"),
            ObjectId("59c4806d241d8d36a1d50de6")
        ]
    }
])

db.teachers.find()

db.stus.find()


多对多的关系 

sq操作整合 

//1.进入my_test数据库
use my_test

//2.向数据库的user集合中插入一个文档  
db.users.insert({
    username:"sunwukong"
});

//3.查询user集合中的文档
db.users.find();

//4.向数据库的user集合中插入一个文档   
db.users.insert({
    username:"zhubajie"
});
   
//5.查询数据库user集合中的文档
db.users.find();

//6.统计数据库user集合中的文档数量
db.users.find().count();

//7.查询数据库user集合中username为sunwukong的文档
db.users.find({username:"sunwukong"});

//8.向数据库user集合中的username为sunwukong的文档,添加一个address属性,属性值为huaguoshan
db.users.update({username:"sunwukong"},{$set:{address:"huaguoshan"}});


//9.使用{username:"tangseng"} 替换 username 为 zhubajie的文档
db.users.replaceOne({username:"zhubajie"},{username:"tangseng"});    
    
//10.删除username为sunwukong的文档的address属性
db.users.update({username:"sunwukong"},{$unset:{address:1}});


//11.向username为sunwukong的文档中,添加一个hobby:{cities:["beijing","shanghai","shenzhen"] , movies:["sanguo","hero"]}
//MongoDB的文档的属性值也可以是一个文档,当一个文档的属性值是一个文档时,我们称这个文档叫做 内嵌文档
db.users.update({username:"sunwukong"},{$set:{hobby:{cities:["beijing","shanghai","shenzhen"] , movies:["sanguo","hero"]}}});
db.users.find();

//12.向username为tangseng的文档中,添加一个hobby:{movies:["A Chinese Odyssey","King of comedy"]}
db.users.update({username:"tangseng"},{$set:{hobby:{movies:["A Chinese Odyssey","King of comedy"]}}})

//13.查询喜欢电影hero的文档
//MongoDB支持直接通过内嵌文档的属性进行查询,如果要查询内嵌文档则可以通过.的形式来匹配
//如果要通过内嵌文档来对文档进行查询,此时属性名必须使用引号 
db.users.find({'hobby.movies':"hero"});

//14.向tangseng中添加一个新的电影Interstellar
//$push 用于向数组中添加一个新的元素
//$addToSet 向数组中添加一个新元素 , 如果数组中已经存在了该元素,则不会添加
db.users.update({username:"tangseng"},{$push:{"hobby.movies":"Interstellar"}});
db.users.update({username:"tangseng"},{$addToSet:{"hobby.movies":"Interstellar"}});
db.users.find();

//15.删除喜欢beijing的用户
db.users.remove({"hobby.cities":"beijing"});

//16.删除user集合
db.users.remove({});
db.users.drop();

show dbs;

//17.向numbers中插入20000条数据 7.2s
for(var i=1 ; i<=20000 ; i++){
    db.numbers.insert({num:i});
}

db.numbers.find()

// 删除速度较快
db.numbers.remove({});


//0.4s
var arr = [];

for(var i=1 ; i<=20000 ; i++){
    arr.push({num:i});
}
//将要插入的数据,放到一个集合里面,调用一次insert的方法,执行方法较快
db.numbers.insert(arr);


//18.查询numbers中num为500的文档
db.numbers.find({num:500})

//19.查询numbers中num大于5000的文档
db.numbers.find({num:{$gt:500}});
db.numbers.find({num:{$eq:500}});

//20.查询numbers中num小于30的文档
db.numbers.find({num:{$lt:30}});

//21.查询numbers中num大于40小于50的文档
db.numbers.find({num:{$gt:40 , $lt:50}});

//22.查询numbers中num大于19996的文档
db.numbers.find({num:{$gt:19996}});

//23.查看numbers集合中的前10条数据
db.numbers.find({num:{$lte:10}});

//limit()设置显示数据的上限
db.numbers.find().limit(10);
//在开发时,我们绝对不会执行不带条件的查询
db.numbers.find();

//24.查看numbers集合中的第11条到20条数据
/*
    分页 每页显示10条
        1-10     0
        11-20    10
        21-30    20
        。。。
        
        skip((页码-1) * 每页显示的条数).limit(每页显示的条数);
        
    skip()用于跳过指定数量的数据    
    
    MongoDB会自动调整skip和limit的位置
*/
db.numbers.find().skip(10).limit(10);

//25.查看numbers集合中的第21条到30条数据
db.numbers.find().skip(20).limit(10);

db.numbers.find().limit(10).skip(10);


//26.将dept和emp集合导入到数据库中
db.dept.find()
db.emp.find()

//27.查询工资小于2000的员工
db.emp.find({sal:{$lt:2000}});

//28.查询工资在1000-2000之间的员工
db.emp.find({sal:{$lt:2000 , $gt:1000}});

//29.查询工资小于1000或大于2500的员工
db.emp.find({$or:[{sal:{$lt:1000}} , {sal:{$gt:2500}}]});

//30.查询财务部的所有员工
//(depno)
var depno = db.dept.findOne({dname:"财务部"}).deptno;
db.emp.find({depno:depno});

//31.查询销售部的所有员工
var depno = db.dept.findOne({dname:"销售部"}).deptno;
db.emp.find({depno:depno});

//32.查询所有mgr为7698的所有员工
db.emp.find({mgr:7698})

//33.为所有薪资低于1000的员工增加工资400元
db.emp.updateMany({sal:{$lte:1000}} , {$inc:{sal:400}});
db.emp.find()


js操作

mongoosejs官网:   http://www.mongoosejs.net/

 

 

密码验证

连接上服务器后

添加整个mongodb数据库的用户信息

//切换到admin数据库,默认在列表上不显示
use admin

// mongodb中的用户是基于身份role的,该管理员账户的 role是 userAdminAnyDatabase。admin用户用于管理账号,不能进行关闭数据库等操作。
db.createUser({
    user: "admin",
    pwd: "123456",
    roles: [{
        role: "userAdminAnyDatabase",
        db: "admin"
    }]
})


// 创建完admin管理员,创建一个超级管理员root。角色:root。root角色用于关闭数据库, db.shutdownServer()
db.createUser({
    user: "root",
    pwd: "123456",
    roles: [{
        role: "root",
        db: "admin"
    }]
})

创建集合数据库的用户

//切换数据库*****(坑)这时候一定,一定要切换到所在数据库上去创建用户,不然创建的用户还是属于admin。
use yang_zzu

//role:"dbOwner"代表数据库所有者角色,拥有最高该数据库最高权限。
//比如新建索引等当账号管理员和超级管理员,可以为自己的数据库创建用户了。
db.createUser({
    user: "first",
    pwd: "123456",
    roles: [{
        role: "dbOwner",
        db: "yang_zzu"
    }]
})

//查看用户
show users

创建附件数据库的用户(没有附件保存到mongodb的话可以不用创建)

// 在为表创建用户之前要先将mongodb的数据库的 认证关闭,然后重启数据库,在进行设置,因为使用 db.auth 无法正常的进行认证操作
use documents-files

db.createUser({
    user: "firstFile",
    pwd: "123456",
    roles: [{
        role: "dbOwner",
        db: "documents-files"
    }]
})

修改配置文件,开启密码验证

security:
  authorization: enabled

切换为 mongod 用户,重启服务

重启的时候,可能会遇到Process: 97409 ExecStart=/usr/bin/mongod $OPTIONS (code=exited, status=14)这个错误,

再打开一个shell对话框,使用root用户删除 /tmp 文件夹下的 mongodb-27017.sock 文件,再次重启服务

systemctl start mongod.service

 

mongodb一个数据库,对应一个用户的密码

 

mongodb附件

mongodb操作文件,主要是通过GridFS类。存储文件主要存放在fs中,其中的fs是数据库默认的。并且GridFS是直接与数据库打交道,与collection集合无关。

由于MongoDB的文档结构为BJSON格式(BJSON全称:Binary JSON),而BJSON格式本身就支持保存二进制格式的数据,因此可以把文件的二进制格式的数据直接保存到MongoDB的文档结构中。但是由于一个BJSON的最大长度不能超过4M,所以限制了单个文档中能存入的最大文件不能超过4M。为了提供对大容量文件存取的支持,samus驱动提供了“GridFS”方式来支持。 

文件列表

文件信息 

文件存储位置

文件的实际存储形式,二进制的形式 

 

springboot整合mongodb

引入jar包

            <!-- mongodb -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-mongodb</artifactId>
                <version>2.2.4.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.mongodb</groupId>
                <artifactId>mongo-java-driver</artifactId>
                <version>3.8.2</version>
            </dependency>

启动类的注解

@SpringBootApplication(scanBasePackages = "com.gree", exclude =  { DataSourceAutoConfiguration.class, FreeMarkerAutoConfiguration.class/*, MongoAutoConfiguration.class, MongoDataAutoConfiguration.class */})
@EnableScheduling
@EnableEncryptableProperties
@EnableRetry//启动重试机制

工具类

GridFS配置引入,文件线程池

监控注解

Controller与监控切面 

 

源码地址

https://github.com/YANG-sty/FIRST

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.了解Spring 2.了解NoSQL和文档数据库 3.要求 4.其他帮助资源 4.1。支持 4.1.1。社区论坛 4.1.2。专业支持 4.2。发展之后 5.新&值得注意的 5.1。Spring Data MongoDB 2.1中的新特性 5.2。Spring Data MongoDB 2.0中的新特性 5.3。Spring Data MongoDB 1.10中的新特性 5.4。Spring Data MongoDB 1.9中的新特性 5.5。Spring Data MongoDB 1.8中的新特性 5.6。Spring Data MongoDB 1.7中有什么新功能 6.依赖 6.1。Spring Boot的依赖管理 6.2。Spring框架 7.使用Spring Data Repositories 7.1。核心概念 7.2。查询方法 7.3。定义存储库接口 7.3.1。微调储存库定义 7.3.2。空处理存储库方法 7.3.3。将存储库与多个Spring Data模块一起使用 7.4。定义查询方法 7.4.1。查询查询策略 7.4.2。查询创建 7.4.3。属性表达式 7.4.4。特殊参数处理 7.4.5。限制查询结果 7.4.6。流式查询结果 7.4.7。异步查询结果 7.5。创建存储库实例 7.5.1。XML配置 7.5.2。JavaConfig 7.5.3。独立使用 7.6。Spring Data存储库的自定义实现 7.6.1。定制个人存储库 7.6.2。自定义基础存储库 7.7。从聚合根发布事件 7.8。Spring数据扩展 7.8.1。Querydsl扩展 7.8.2。Web支持 7.8.3。存储库填充程序 7.8.4。传统网络支持 参考文档 8.介绍 8.1。文档结构 9. MongoDB支持 9.1。入门 9.2。示例存储库 9.3。用Spring连接到MongoDB 9.3.1。使用基于Java的元数据注册Mongo实例 9.3.2。使用基于XML的元数据注册Mongo实例 9.3.3。MongoDbFactory接口 9.3.4。使用基于Java的元数据注册MongoDbFactory实例 9.3.5。使用基于XML的元数据注册MongoDbFactory实例 9.4。MongoTemplate简介 9.4.1。实例化MongoTemplate 9.4.2。WriteResultChecking策略 9.4.3。WriteConcern 9.4.4。WriteConcernResolver 9.5。保存,更新和删除文档 9.5.1。如何_id在映射图层中处理该字段 9.5.2。类型映射 9.5.3。保存和插入文件的方法 9.5.4。更新集合中的文档 9.5.5。在集合中插入文档 9.5.6。在集合中查找和插入文档 9.5.7。删除文件的方法 9.5.8。乐观锁定 9.6。查询文件 9.6.1。查询集合中的文档 9.6.2。查询文件的方法 9.6.3。查询不同的值 9.6.4。地理空间查询 9.6.5。GeoJSON支持 9.6.6。全文查询 9.6.7。排序规则 9.6.8。JSON模式 9.6.9。流利的模板API 9.7。按实例查询 9.7.1。介绍 9.7.2。用法 9.7.3。示例匹配器 9.7.4。执行一个例子 9.7.5。无类型示例 9.8。减少地图操作 9.8.1。使用示例 9.9。脚本操作 9.9.1。使用示例 9.10。集团运营 9.10.1。使用示例 9.11。聚合框架支持 9.11.1。基本概念 9.11.2。支持的聚合操作 9.11.3。投影表达式 9.11.4。分面分类 9.12。用自定义转换器覆盖默认映射 9.12.1。使用已注册的Spring Converter进行保存 9.12.2。使用Spring转换器读取 9.12.3。使用MongoConverter注册Spring转换器 9.12.4。转换器消除歧义 9.13。索引和集合管理 9.13.1。创建索引的方法 9.13.2。访问索引信息 9.13.3。使用集合的方法 9.14。执行命令 9.14.1。执行命令的方法 9.15。生命周期事件 9.16。例外翻译 9.17。执行回调 9.18。GridFS支持 9.19。更改流 9.19.1。使用MessageListener更改流 9.19.2。更改流 - 无效 10.反应性的MongoDB支持 10.1。入门 10.2。使用Spring和Reactive Streams Driver连接到MongoDB 10.2.1。使用基于Java的元数据注册MongoClient实例 10.2.2。ReactiveMongoDatabaseFactory接口 10.2.3。使用基于

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值