Mongodb安装及其使用

1.Linux系统上安装Mongodb

  1. 在usr/local文件夹下创建mongo文件夹
    在这里插入图片描述
  2. 下载mongodb包
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-6.0.5.tgz
  1. 解压mongodb
tar -zxvf  mongodb-linux-x86_64-rhel70-6.0.5.tgz
  1. 更改文件夹的名字
mv mongodb-linux-x86_64-rhel70-6.0.5 mongodb-6.0.5 

在这里插入图片描述

  1. 进入mongodb-6.0.5 文件夹
cd mongodb-6.0.5 
  1. 创建data、log、conf文件夹
mkdir data
mkdir log
mkdir conf

在这里插入图片描述

  1. 启动mongodb服务
bin/mongod --port=27017 --dbpath=/usr/local/mongo/mongodb-6.0.5/data --logpath=/usr/local/mongo/mongodb-6.0.5/log/mongodb.log \--bind_ip=0.0.0.0 --fork
  1. 配置环境变量(修改配置文件etc/profile)
export MONGODB_HOME=/usr/local/mongo/mongodb-6.0.5
PATH=$PATH:$MONGODB_HOME/bin

在这里插入图片描述

  1. 在conf文件夹下面创建mongo.conf配置文件
cd conf
vim mongo.conf

配置文件的内容为

systemLog:destination: filepath: /usr/local/mongo/mongodb-6.0.5/log/mongod.loglogAppend: true
storage:dbPath: /usr/local/mongo/mongodb-6.0.5/dataengine: wiredTiger #存储引擎journal:enabled: true
net:bindIp: 0.0.0.0port: 27017
processManagement:fork: true
  1. 启动和关闭mongodb
#启动mongodb
mongod  -f /usr/local/mongo/mongodb-6.0.5/conf/mongo.conf#关闭mongodb
mongod --port=27017 --dbpath=/usr/local/mongo/mongodb-6.0.5/data --shutdown 
  1. mongosh使用
#centos7 安装mongosh wget https://downloads.mongodb.com/compass/mongodb-mongosh-1.8.0.x86_64.rpm yum install -y mongodb-mongosh-1.8.0.x86_64.rpm # 连接mongodb server端 
mongosh --host=192.168.2.66 --port=27017 
mongosh 192.168.2.66:27017 # 指定uri方式连接 
mongosh mongodb://192.168.2.66:27017/test

2.Mongodbd的使用

在这里插入图片描述

2.1 常见命令

1.数据集操作
#查看所有数据库
show dbs#切换到指定数据库,不存在则创建
use users#删除当前数据库
db.dropDatabase()

在这里插入图片描述

2.集合操作
# 查看集合
show collections#创建集合
db.createCollection("emp")#删除集合
db.emp.drop()

在这里插入图片描述

3.安全认证
1.创建管理员用户
#设置管理员用户名需要切换到admin
use admin#创建管理员
db.createUser({user:"fox",pwd:"fox",roles:["root"]})#查看当前数据库所有用户信息
show users#显示可设置权限
show roles#显示所用用户
db.system.users.find()

在这里插入图片描述

2 重新赋予用户操作权限

在这里插入图片描述

#创建用户
db.createUser({user:"fox",pwd:"fox",roles:["root"]})#重新赋予用户相关权限
db.grantRolesToUser("fox",[{role:"clusterAdmin",db:"admin"},{role:"userAdminAnyDatabase",db:"admin"},{role:"readWriteAnyDatabase",db:"admin"}])
3 删除某个用户
#进入权限库
use admin#删除某个用户
db.dropUser("fox")#删除当前所有用户
db.dropAllUser()

在这里插入图片描述
在这里插入图片描述

4 创建应用数据库用户
use appdb
db.createUser({user:"appdb",pwd:"nickel",roles:["dbOwner"]})
5 MongoDb启用鉴权
#启用鉴权
mongod -f /usr/local/mongo/mongodb-6.0.5/conf/mongo.conf --aut#登录数据库
mongosh 192.168.2.66 -u nickel -p nickel --authenticationDatabase=admin
4.Docker安装Mongodb
#拉取mongo镜像
docker pull mongo:6.0.5#运行mongo镜像
docker run --name mongo-server -p 29017:27017 \
-e MONGO_INITDB_ROOT_USERNAME=fox \
-e MONGO_INITDB_ROOT_PASSWORD=fox \
-d mongo:6.0.5 --wiredTigerCacheSizeGB 1
5.远程连接mongodb
mongosh ip:29017 -u nickel -p nickel
6.远程连接mongodb常见工具
一.MongoDB常用工具

1.GUI工具
官方GUI:COMPASS
  MongoDB图形化管理工具(GUI),能够帮助您在不需要知道MongoDB查询语法的前提下,便利地分析和理解您的数据库模式,并且帮助您可视化地构建查询。
  下载地址:https://www.mongodb.com/zh-cn/products/compass

2.Robo 3T(免费)*
  下载地址:https://robomongo.org/

3.Studio 3T(收费,试用30天)
  下载地址:https://studio3t.com/download/

*4.MongoDB Database Tools
  下载地址:https://www.mongodb.com/try/download/database-tools
  文件名称作用mongostat数据库性能监控工具mongotop热点表监控工具mongodump数据库逻辑备份工具mongorestore数据库逻辑恢复工具mongoexport数据导出工具mongoimport数据导入工具bsondumpBSON格式转换工具mongofilesGridFS文件工具

7.mongodb基本命令
1.单条插入命令
db.emps.insertOne({name:'fox',age:35})

在这里插入图片描述

2.多条插入命令
db.emps.insertMany([{name:'小明',age:5},{name:'小红',age:10}])

在这里插入图片描述

3.执行js脚本
  • 直接执行下面脚本
var tags=["nosql","mongodb","document","developer","popular"]; 
var types=["technology","sociality","travel","novel","literature"]; 
var books=[];
for(var i=0;i<50;i++){var typeIdx=Math.floor(Math.random()*types.length);  var tagIdx=Math.floor(Math.random()*tags.length);var favCount=Math.floor(Math.random()*100); var book={title:"book-"+i, type:types[typeIdx], tag:tags[tagIdx], favCount:favCount,author:"xxx"+i }; books.push(book) } db.books.insertMany(books);
  • 创建books.js文件执行
    1.创建一个file文件夹,在文件夹中创建books.js文件,在把上面语句访问js文件中
#创建文件夹
mkdir file#进入文件夹
cd file#创建books.js文件
vim books.js#连接mongodb数据库
mongosh -u nickel -p nickel #切换到相关的库
use books#执行js文件
load("books.js")

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.查询方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#单条查询
db.books.findOne()#多条查询
db.books.find()#条件查询(查询tag=nosql 只显现title和author两个字段,其余默认)
db.books.find({tag:"nosql"},{title:1,author:1})#条件查询(tag=nosql 只显现title和author两个字段,其余不显示)
db.books.find({tag:"nosql"},{_id:0,title:1,author:1})#条件查询(按照ID查询一条数据)
db.books.find({_id:ObjectId("6568a247d664d21d99dcbbbe")})#条件查询(type=travel和favCount>60)
db.books.find({type:'travel',favCount:{$gt:60}})#查询条件中使用正则表达式(type中包含so的数据)
#方式1
db.books.find({type:{$regex:"so"}})
#方式2
db.books.find({type:/so/})

加粗样式
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.排序方法
#按照favCount进行倒序(type="travel")
db.books.find({type:"travel"}).sort({favCount:-1})#按照favCount进行正序(type="travel")
db.books.find({type:"travel"}).sort({favCount:1})

在这里插入图片描述
在这里插入图片描述

6.分页
#查询16条记录后三条记录
db.books.find().skip(16).limit(3)#查询第一页的数据
db.books.find({}).sort({_id:1}).limit(10)#查询第二页的数据
#db.books.find({_id: {$gt: <第一页最后一个_id>}}).sort({_id: 1}).limit(10);
db.books.find({_id:{$gt:ObjectId("65691cb29b6f2f9eb3ffd693")}}).sort({_id:1}).limit(10)#查询第三页的数据
#db.books.find({_id: {$gt: <第二页最后一个_id>}}).sort({_id: 1}).limit(10)
db.books.find({_id:{$gt:ObjectId("65691cb29b6f2f9eb3ffd69d")}}).sort({_id:1}).limit(10)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
说明:处理分页问题 – 避免使用 count

db.coll.find({x: 100}).limit(50);
db.coll.count({x: 100});
  • 前者只需要遍历前 n 条,直到找到 50 条 x=100 的文档即可结束;
  • 后者需要遍历完 1000w 条找到所有符合要求的文档才能得到结果。 为了计算总页数而进行的 count() 往往是拖慢页面整体加载速度的原因
7.更新文档

在这里插入图片描述

#修改数据(name=小明 age从5修改为8)
db.emps.updateOne({name:"小明"},{$set:{age:8}})#修改数据(name=小明 把age增加为1)
db.emps.updateOne({name:"小明"},{$inc:{age:1}})#更改列名(name=小明 把name改为name1)
db.emps.updateOne({name:"小明"},{$rename:{"name":"name1"}})#增加列名(增加sex列名,默认为1)
db.emps.updateMany({},{$unset:{"sex":1}})#删除列名(删除sex列名)
db.emps.updateMany({},{$unset:{"sex":1}})#不存在则插入(插入title=my book)
db.books.updateOne({title:"my book"},{$set:{tags:["nodql","mongodb"],type:"none",author:"fox"}},{upsert:true})#更新多条数据(更新type="novel",增加publishedDate字段)
db.books.updateMany({type:"novel"},{$set:{publishedDate:new Date()}})#查询数据并修改数据,显示的数据是修改之前的数据
db.books.findAndModify({query:{_id:ObjectId("65691cb29b6f2f9eb3ffd6ac")},update:{$inc:{favCount:1}}
})#查询数据并修改数据,显示的数据是修改之后的数据
db.books.findAndModify({query:{_id:ObjectId("65691cb29b6f2f9eb3ffd6ac")},update:{$inc:{favCount:1}},new:true
})

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
.

8.删除文档
#删除满足条件((type=novel))的id最小的数据
db.books.deleteOne({type:"novel"})#删除集合下的全部文档
db.books.deleteMany({})#删除满足条件((type=novel))所有数据
db.books.deleteMany({type:"novel"})#删除满足条件((type=novel))一条数据,并显示该条删除的数据
db.books.findOneAndDelete({type:"novel"})#按照favCount正序之后,然后删除第一条数据
db.books.findOneAndDelete({type:"novel"},{sort:{favCount:1}})

在这里插入图片描述
在这里插入图片描述

9.批量操作数据(bulkwrite())
#批量插入数据
db.pizzas.insertMany( [{ _id: 0, type: "pepperoni", size: "small", price: 4 },{ _id: 1, type: "cheese", size: "medium", price: 7 },{ _id: 2, type: "vegan", size: "large", price: 8 }
] )#批量操作数据
db.pizzas.bulkWrite([{insertOne:{document:{_id:3,type:"beef",size:"medium",price:6}}},{insertOne:{ducument:{_id:4,type:"sausage",size:"large",price:10}}},{updateOne:{filter:{type:"cheese"},update:{$set:{price:8}}}},{deleteOne:{filter:{type:"pepperoni"}}},{replaceOne:{filter:{type:"vegan"},replacement:{type:"tofu",size:"small",price:4}}}
])

在这里插入图片描述
在这里插入图片描述

10.日期类型
#插入时间格式
db.dates.insertMany([
{data1:Date()},{data2:new Date()},{data3:ISODate()}
])

在这里插入图片描述

11.内嵌文档
#插入嵌套文档
db.books.insert({title:"我们的爱情故事",author:{name:"Nickel",gender:"男",hometown:"重庆"}
})#按照嵌套文档的内容进行查找
db.books.find({"author.name":"Nickel"})#修改嵌套文档中name=Nickel的hometownm名称
db.books.updateOne({"author.name":"Nickel"},{$set:{"author.hometown":"重庆/贵州"}}) #增加tags标签字段
db.books.updateOne({"author.name":"Nickel"},{$set:{"tags:["履行","随笔","散文","爱情","文学"]"}}) #在tags标签里面追加单个标签
db.books.updateOne({"author.name":"Nickel"},{$push:{tags:"猎奇"}})#在tags标签里面追加多个标签
db.books.updateOne({"author.name":"Nickel"},{$push:{tags:{$each:["伤感","想象力"]}}})#在tags标签里面追加多个标签,然后截取后面三个标签
db.books.updateOne({"author.name":"Nickel"},{$push:{tags:{$each:["伤感","想象力"],$slice:-3}}})

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


嵌套数组的运用

#嵌套数组的运用
db.goods.insertMany([{name:"羽绒服",tags:[{tagKey:"size",tagValue:["M","L","XL","XXL","XXXL"]},{tagKey:"color",tagValue:["黑色","宝蓝"]},{tagKey:"style",tagValue:"韩风"},]},{name:"羊毛衫",tags:[{tagKey:"size",tagValue:["L","XL","XXL"]},{tagKey:"color",tagValue:["蓝色","否色"]},{tagKey:"style",tagValue:"韩风"},]}
])

在这里插入图片描述在这里插入图片描述


筛选出黑色的数据

#筛选出黑色的数据
db.goods.find({tags:{$elemMatch:{tagKey:"color",tagValue:"黑色"}}
})

在这里插入图片描述


筛选出color=蓝色,并且size=XL的商品

#筛选出color=蓝色,并且size=XL的商品
db.goods.find({tags:{$all:[{$elemMatch:{tagKey:"color",tagValue:"黑色"}},{$elemMatch:{tagKey:"size",tagValue:"XL"}}]}
})

在这里插入图片描述

12.固定(封顶)集合

  固定集合(capped collection)是一种限定大小的集合,其中capped是覆盖、限额的意思。跟普通的集合相比,数据在写入这种集合时遵循FIFO原则。可以将这种集合想象为一个环状的队列,新文档在写入时会被插入队列的末尾,如果队列已满,那么之前的文档就会被新写入的文档所覆盖。通过固定集合的大小,我们可以保证数据库只会存储“限额”的数据,超过该限额的旧数据都会被丢弃。
在这里插入图片描述

db.createCollection(“logs”,{capped:true,size:4096,max:10})

  • capped:是否是固定集合
  • max:指集合的文档数量最大值,这里是10条
  • size:指集合的空间占用最大值,这里是4096字节(4KB)
    这两个参数会同时对集合的上限产生影响。也就是说,只要任一条件达到阈值都会认为集合已经写满。其中size是必选的,而max则是可选的。
    可以使用collection.stats命令查看文档的占用空间
#创建固定集合
db.createCollection("logs",{capped:true,size:4096,max:10})#将普通集合转化为固定集合
db.runCommand({"convertToCapped": "mycoll", size: 100000})#参事向集合中插入数据,查看是否覆盖
for(var i=5;i<15;i++){db.logs.insert({t:"row"+i})
}

在这里插入图片描述
在这里插入图片描述
适用场景
 &emsp固定集合很适合用来存储一些“临时态”的数据。“临时态”意味着数据在一定程度上可以被丢弃。同时,用户还应该更关注最新的数据,随着时间的推移,数据的重要性逐渐降低,直至被淘汰处理。
  一些适用的场景如下:

  • 系统日志,这非常符合固定集合的特征,而日志系统通常也只需要一个固定的空间来存放日志。在MongoDB内部,副本集的同步日志(oplog)就使用了固定集合。
  • 存储少量文档,如最新发布的TopN条文章信息。得益于内部缓存的作用,对于这种少量文档的查询是非常高效的。

股票监听案例

  1. 创建stock_queue消息队列,其可以容纳10MB的数据
db.createCollection("gupiao_queue",{capped:true,size:10485760})
  1. 为了能支持按时间条件进行快速的检索,比如查询某个时间点之后的数据,可以为timestamp添加索引
db.gupiao_queue.createIndex({timestamped:1})
  1. 构建生产者,发布股票动态,并执行生产者
function pushEvent(){while(true){db.gupiao_queue.insert({timestamped:new Date(),stock: "MongoDB Inc",price: 100*Math.random(1000)});print("publish stock changed");sleep(1000);}
}pushEvent()
  1. 构建消费者,监听股票动态,并执行消费者
function listen(){var cursor = db.gupiao_queue.find({timestamped:{$gte:new Date()}}).tailable();while(true){if(cursor.hasNext()){print(JSON.stringify(cursor.next(),null,2));}sleep(1000);}
}listen()

效果展示
在这里插入图片描述
在这里插入图片描述

3.MongodDB数据类型详解

3.1 BSON协议与数据类型

MongoDB为什么会使用BSON?
  JSON是当今非常通用的一种跨语言Web数据交互格式,属于ECMAScript标准规范的一个子集。JSON(JavaScript Object Notation, JS对象简谱)即JavaScript对象表示法,它是JavaScript对象的一种文本表现形式。
  作为一种轻量级的数据交换格式,JSON的可读性非常好,而且非常便于系统生成和解析,这些优势也让它逐渐取代了XML标准在Web领域的地位,当今许多流行的Web应用开发框架,如SpringBoot都选择了JSON作为默认的数据编/解码格式。
  JSON只定义了6种数据类型:

  • string: 字符串
  • number : 数值
  • object: JS的对象形式,用{key:value}表示,可嵌套
  • array: 数组,JS的表示方式[value],可嵌套
  • true/false: 布尔类型
  • null: 空值

3.2 ObjectId生成器

  MongoDB集合中所有的文档都有一个唯一的_id字段,作为集合的主键。在默认情况下,_id字段使用ObjectId类型,采用16进制编码形式,共12个字节。
  为了避免文档的_id字段出现重复,ObjectId被定义为3个部分:

  • 4字节表示Unix时间戳(秒)。
  • 5字节表示随机数(机器号+进程号唯一)。
  • 3字节表示计数器(初始化时随机)。
    在这里插入图片描述
    在这里插入图片描述

4.SpringBoot整合mongoDB

一.项目初始化

1.引入相关的jar包

 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.16</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>

2.在application.yml配置mongodb启动项

spring:data:mongodb:uri: mongodb://nickel:nickel@192.168.2.66:27017/test?authSource=admin

3.创建emp表的实体类

package com.nq.springbootmongodb.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;import java.util.Date;/*** @Auther: Nickel* DATE: 2023/12/2 14:56* Description:* @Version 1.0*/
@Document("emp")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Employee {@Idprivate Integer id;@Field("username")private String name;@Fieldprivate int age;@Fieldprivate Double salary;@Fieldprivate Date entryDay;
}

4.测试实体类是否存在,不存在则创建

/*** @Auther: Nickel* DATE: 2023/12/2 14:40* Description:* @Version 1.0*/
@SpringBootTest
public class TestCollection {@AutowiredMongoTemplate mongoTemplate;@Testpublic void test1(){boolean exists = mongoTemplate.collectionExists("emp");if(exists){//删除集合mongoTemplate.dropCollection("emp");}mongoTemplate.createCollection("emp");}
}

在这里插入图片描述

二.java增删查改

1.新增

    @Testpublic void testInsert(){Employee employee=new Employee(1,"Nickel",28,3000d,new Date());mongoTemplate.insert(employee);List<Employee> list = Arrays.asList(new Employee(2, "fox", 22, 280020d, new Date()),new Employee(3, "zhuge", 33, 2263d, new Date()),new Employee(4, "zhouyu", 35, 282320d, new Date()));mongoTemplate.insert(list,Employee.class);}

在这里插入图片描述

2.查询

  • 通过对象进行查询
@Testpublic void testFind(){//查询所有文档System.out.println("========查询所有文档======");List<Employee> list = mongoTemplate.findAll(Employee.class);list.forEach(System.out::println);//根据ID进行查询System.out.println("======根据ID进行查询========");Employee employee = mongoTemplate.findById(1, Employee.class);System.out.println(employee);//返回第一个文档的数据System.out.println("=======返回第一个文档的数据=======");Employee one = mongoTemplate.findOne(new Query(), Employee.class);System.out.println(one);//条件查询System.out.println("=======查询薪资大于等于8000的员工=======");//查询薪资大于等于8000的员工Query query8000=new Query(Criteria.where("salary").gte(8000));List<Employee> list2 = mongoTemplate.find(query8000, Employee.class);list2.forEach(System.out::println);System.out.println("=======查询薪资大于等于4000小于等于10000=======");//查询薪资大于等于4000小于等于10000Query query8_10=new Query(Criteria.where("salary").gte(4000).lte(10000));List<Employee> list3 = mongoTemplate.find(query8_10, Employee.class);list3.forEach(System.out::println);System.out.println("=======模糊查询name中包含zh的=======");//正则模糊查询  java正则不需要有//Query query_zh=new Query(Criteria.where("name").regex("zh"));List<Employee> list4 = mongoTemplate.find(query_zh, Employee.class);list4.forEach(System.out::println);//and  or  多条件查询System.out.println("=======查询年龄大于25薪资大于8000的员工=======");Criteria criteria_25_8000=new Criteria();//查询年龄大于25薪资大于8000的员工criteria_25_8000.andOperator(Criteria.where("age").gte(25),Criteria.where("salary").gte(8000));Query query=new Query(criteria_25_8000);List<Employee> list5 = mongoTemplate.find(query, Employee.class);list5.forEach(System.out::println);System.out.println("=======查询年龄大于25薪资大于8000的员工=======");Criteria criteria_zhuge_8000=new Criteria();//查询姓名是zhuge或者薪资大于8000的员工criteria_zhuge_8000.orOperator(Criteria.where("name").is("zhuge"),Criteria.where("salary").gte(8000));Query query1=new Query(criteria_zhuge_8000);List<Employee> list6 = mongoTemplate.find(query1, Employee.class);list6.forEach(System.out::println);//排序System.out.println("=======排序=======");Query query2=new Query(criteria_zhuge_8000).with(Sort.by(Sort.Order.desc("salary")));List<Employee> list7 = mongoTemplate.find(query2, Employee.class);list7.forEach(System.out::println);//分页System.out.println("=======分页=======");query=new Query().skip(2)  //跳过前面两条.limit(1);  //显示一条数据List<Employee> list8 = mongoTemplate.find(query, Employee.class);list8.forEach(System.out::println);}
  • 通过json格式进行查询
  @Testpublic void testFindByJson(){System.out.println("=======分页=======");//查询年龄大于25或者薪资大于等于8000String json="{$or:[" +"{age:{$gt:25}}" +",{salary:{$gte:8000}}" +"]}";Query query=new BasicQuery(json);List<Employee> list = mongoTemplate.find(query,Employee.class);list.forEach(System.out::println);}

3.更新

 @Testpublic void testUpdate(){Query query=new Query(Criteria.where("salary").lte(5000));System.out.println("=======更新前=======");List<Employee> list = mongoTemplate.find(query, Employee.class);list.forEach(System.out::println);System.out.println("=======把id为1的薪资调为5000=======");//把id为1的薪资调为5000Update update=new Update();update.set("salary",5000);System.out.println("=======更新满足条件的一条======");UpdateResult updateResult = mongoTemplate.updateFirst(query, update, Employee.class);System.out.println("=======更新满足条件的所有记录=====");UpdateResult updateResult2 = mongoTemplate.updateMulti(query, update, Employee.class);List<Employee> list2 = mongoTemplate.find(query, Employee.class);list2.forEach(System.out::println);}

在这里插入图片描述
在这里插入图片描述

4.删除

 @Testpublic void testDelete(){//删除所有文档// mongoTemplate.remove(new Query(),Employee.class);System.out.println("=======删除前=======");List<Employee> list = mongoTemplate.find(new Query(), Employee.class);list.forEach(System.out::println);System.out.println("=======删除薪资大于等于1000=======");//删除薪资大于等于1000Query query2=new Query(Criteria.where("salary").gte(10000));mongoTemplate.remove(query2,Employee.class);List<Employee> list2 = mongoTemplate.find(new Query(), Employee.class);list2.forEach(System.out::println);}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/190557.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RCE绕过

1.[SCTF 2021]rceme 总结下获取disabled_funciton的方式 1.phpinfo() 2.var_dump(ini_get(“disable_functions”)); 3.var_dump(get_cfg_var(“disable_functions”)); 其他的 var_dump(get_cfg_var(“open_basedir”)); var_dump(ini_get_all()); <?php if(isset($_POS…

蓝桥杯算法心得——小郑躲太阳(思维推导)

大家好&#xff0c;我是晴天学长&#xff0c;一道与平时的题型截然不同的题型&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .小郑躲太阳 问题描述 小郑一觉醒来发现起晚啦!现在需要从家里飞速前往公司…

B026-MySQL基础

目录 数据库概述数据库概念数据库的由来和发展常见的关系型数据库服务器&#xff08;DBMS&#xff09;SQL概述表的概念 数据库的安装与配置安装启动和连接MySQL启动MySQL服务连接MySQL MySQL图形化管理软件-Navicat数据库安装失败解决方案 MySQL数据库操作数据库操作和存储引擎…

8.ROS的TF坐标变换(二):动态坐标变换、多坐标变换代码讲解(以LIO-SAM为例)

目录 1 ROS的动态坐标变换及代码解释 1.1 什么是ROS的动态坐标变换 1.2 CMakeLists.txt、package.xml基础配置 1.3 发布方代码实现 1.4 接收方代码实现 2 ROS的多坐标变换及代码解释 2.1 什么是ROS的多坐标变换 2.2 发布方代码实现 2.3 接收方代码实现 3 L…

图解系列--功能追加协议,构建Web内容

功能追加协议 1.消除 HTTP 瓶颈的 SPDY 1.1.HTTP 的瓶颈 使用 HTTP 协议探知服务器上是否有内容更新&#xff0c;就必须频繁地从客户端到服务器端进行确认。如果服务器上没有内容更新&#xff0c;那么就会产生徒劳的通信。 若想在现有 Web 实现所需的功能&#xff0c;以下这些…

线程与多线程编程

1. 线程 1.1 概念 线程又可以称为轻量级进程 &#xff0c;在进程的基础上做出了改进。 一个进程在刚刚启动时&#xff0c;做的第一件事就是申请内存和资源&#xff0c;进程需要把依赖的代码和数据&#xff0c;从磁盘加载到内存中这件事是比较耗费时间的&#xff0c;有的业务…

matlab simulink 永磁同步电机PI调速控制

1、内容简介 略 27-可以交流、咨询、答疑 2、内容说明 永磁同步电机调速控制 永磁同步电机PI调速控制 永磁同步电机PI调速控制、PMSM 3、仿真分析 略 4、参考论文 略 链接&#xff1a;https://pan.baidu.com/s/1AAJ_SlHseYpa5HAwMJlk1w 提取码&#xff1a;rvol 路…

科研者的福利!一个集论文、代码、数据集为一体的网站

Papers with Code 是一个总结了机器学习论文及其代码实现的网站。大多数论文都是有GitHub代码的。这个网站最好的地方就是对机器学习做了任务分类&#xff0c;检索对应的模型非常方便。早在18年Paper With Code创立时就轰动一时&#xff0c;仅创立一年就被Facebook收购。 Pape…

Spring AOP记录接口访问日志

Spring AOP记录接口访问日志 介绍应用范围组成通知&#xff08;Advice&#xff09;连接点&#xff08;JoinPoint&#xff09;切点&#xff08;Pointcut&#xff09;切面&#xff08;Aspect&#xff09;引入&#xff08;Introduction&#xff09;织入&#xff08;Weaving&#x…

Linux--初识和基本的指令(3)

目录 1.前言 1.指令 1.1 cat指令 1.2 echo指令 1.3 more 指令 1.4 less指令 1.5 什么时候使用less和more 1.6 head指令 1.7 tail指令 1.8 wc指令 1.9 与时间相关的指令 1.9.1 date指令 1.9.2 cal指令 1.10 16.find指令&#xff1a;&#xff08;灰常重要&#x…

千梦网创:熟悉抖音内容创作的切入方式

因为身边抖音网红的资源比较近&#xff0c;所以虽然一直没有露脸去做短视频运营&#xff0c;但是最近也是跟随朋友一起开始了短视频的学习之路。 在参观过一些“超级直播间”之后&#xff0c;我们敲定了未来的两个盈利方向&#xff0c;这两个方向可以将我们身边的资源极致利用…

MyBatis-逆向工程

1.简单生成 1.添加依赖和插件 <dependencies><!-- MyBatis核心依赖包 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.9</version></dependency><!-- MySQL驱动…

金蝶Apusic应用服务器deployApp接口任意文件上传漏洞复现 [附POC]

文章目录 金蝶Apusic应用服务器deployApp接口任意文件上传漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 金蝶Apusic应用服务器deployApp接口任意文件上传漏洞复现 [附POC] 0x01 前言 免责声明…

【前端】-【electron】

文章目录 介绍electron工作流程环境搭建 electron生命周期&#xff08;app的生命周期&#xff09;窗口尺寸窗口标题自定义窗口的实现阻止窗口关闭父子及模态窗口自定义菜单 介绍 electron技术架构&#xff1a;chromium、node.js、native.apis electron工作流程 桌面应用就是…

常见的攻击防护

只做模拟机器使用&#xff0c;不使用真实机器 目录 一、 DHCP饿死和防护应对措施.................................. 1 1&#xff0c; 实验拓扑&#xff1a;...................................................... 2 2&#xff0c; 实验配置............................…

Web自动化测试怎么做?Web自动化测试的详细流程和步骤

1.什么是web自动化测试 自动化&#xff08;Automation&#xff09;是指机器设备、系统或过程&#xff08;生产、管理过程&#xff09;在没有人或较少人的直接参与下&#xff0c;按照人的要求&#xff0c;经过自动检测、信息处理、分析判断、操纵控制&#xff0c;实现预期的目标…

opencv阈值处理

阈值处理 二值化 自适应阈值 OTSU二值化

latex表格中内容过多如何换行【已解决】

最近在写论文的时候放了一个表格&#xff0c;但是表格看起来特别大&#xff0c;因为想让某些内容多的单元格完成换行操作 首先在main.tex引入makecell包 \usepackage{makecell} 然后回到表格找到你想换行的单元格&#xff0c;把\makecell{}加进去&#xff0c;然后在需要换行的…

基于物联网技术的基站能耗监控解决方案-安科瑞 蒋静

摘 要&#xff1a;随着社会的不断发展和进步&#xff0c;人们对通信基站的需求增加。随着通信基站大规模的建设和使用&#xff0c;基站内部的电源情况、供电安全保障或节能减排等问题&#xff0c;仍然是基站建设的着重问题。不管是建设者还是使用者&#xff0c;都应当注重用电安…

[socket 弹 shell] msg_box3

前言 题目比较简单&#xff0c;没开 Canary 和 NX. Arch: amd64-64-littleRELRO: Full RELROStack: Canary foundNX: NX disabledPIE: PIE enabledRWX: Has RWX segments 漏洞利用与分析&#xff1a; 白给的函数调用&#xff0c;其中 ptr 10 是用…