当前位置:网站首页>MongDB学习笔记
MongDB学习笔记
2022-07-05 14:35:00 【JavaSupeMan】
1.NoSQL的特点
是一种非关系型数据库,文档形式的存储
特点:文档数据库将数据以文档的形式存储,BSON格式,类似JSON,是一系列数据项的集合。每个数据项都有一个名称与对应的值,值既可以是简单的数据类型,如字符串/数字/日期等。也可以是复杂的类型。
==优点:==数据结构要求不严格,表结构可变,不需要像关系型数据库一样需要预先定义表结构
==缺点:==查询性能不高,缺乏统一的查询语法
应用场景:日志,web应用等
启动命令:
--dbpath: 指定数据文件存放目录
--logpath:指定日志文件,注意是指定文件不是目录
--logappend:使用追加的方式记录日志
--port:指定端口,默认为27017
--bind_ip:绑定服务IP,若绑定127.0.0.1,则只能本机访问,默认为本机地址
mongod --dbpath D:\MongDB\data\db
3.安全认证
创建管理员账号
#设置管理员用户名密码需要切换到admin库
use admin
#创建管理员
db.createUser({
user:"fox",pwd:"fox",roles:["root"]})
#查看所有用户信息
show users
#删除用户
db.dropUser("fox")
#使用用户进行登录,默认到admin库
mongo -ufox -pfox --authenticationDatabase=admin
4.MongoDB文档操作
1.插入文档
2.查询文档
db.collection.find(query,projection)
db.collection.findOne(query,projection)
*query:可选,使用查询操作符指定查询条件
*projection:可选,使用投影操作符指定返回的键
查询对照表
例:
例:
查出库users中所有数据
db.users.find()
条件查询,查询user值为root的
db.users.find({user:“root”})
查询某个值大于某个数的值
db.users.find({age:{$gt:60}})
查询出第一条
db.users.findOne()
排序&分页
在MongoDB中使用sort()方法对数据进行排序
#指定按收藏数(favCount)降序返回 -1表示降序 表示升序
favCount type都是字段名
db.books.find({
type:"travel"}).sort({
favCount:-1})
分页查询:通过skip和limit去实现,skip表示指定跳过记录数,limit表示限定返回结果数量
例:
db.books.find().skip().limit(5)
3.更新文档
可以用update命令对指定的数据进行更新,命令格式如下:
db.collection.update(query,update,options)
db.collection.updateOne(query,update,options) //更新单个文档 相当于 multi属性为true
db.collection.updateMany(query,update,options) //更新多个文档
db.collection.replaceOne(query,update,options) //替换单个文档
# 属性解释:
# query :描述更新的查询条件
# update:描述更新的动作及新的内容
# options:描述更新的选项
# - upsert:可选,如果不存在update的记录,是否插入新的记录。默认false,不插入
- multi:可选,是否按条件查询出的多条记录全部更新。默认false,只更新找到的第一条记录
- writeConcern:可选,决定一个写操作落到多少个节点上才算成功(类似于事务操作)
update操作符如下:
例:
db.books.update({
type:"novel"},{
$Set:{
publishedDate:new Date()}},{
"multi":true})
注意:如果udate命令中的更新描述不包含任何操作符,那么MongoDB会实现文档的replace语义
例:
db.books.update({
type:"novel"},{
age:"1"})
会先找到type为novel的数据,然后它的内容被全部替换,替换的只剩 age:1
findAndModify命令:
查找并更新,只能操作单文档,不能操作多文档
格式:
例:增加new :true,会返回更新后的值,false返回更新前的值
db.books.findAndModify({
query:{
},update:{
}},new :true)
findOneAndUpdate: 更新单个文档并返回更新前(或更新后)的文档
findOneAndReplace:替换单个文档并返回替换前(或替换后)的文档
4.删除文档
remove命令
例:
例:
db.books.remove({
age:28}) //删除age等于28 的记录
db.books.remove({
age:{
$lt:25}}) //删除age小于25的记录
db.books.remove({
}) //删除所有记录
假如符合条件的有多个,但是只删除第一个,则需要制定justOne的参数,格式如下
例:
例:
db.books.remove({
age:28},true)
delete命令:
官方推荐使用deleteOne()和deleteMany()方法删除稳定,语法格式如下:
例:
db.books.deleteMany({
}) //删除集合下全部文档
db.books.deleteMany({
type:"novel"}) //指定条件的数据全部删除
db.books.deleteOne({
type:"novel"}) //指定条件的数据,只删除第一个
如果需要返回被删除的文档
命令:findOneAndDelete
例:
db.books.findOneAndDelete({
type:"novel"}) //删除集合下全部文档
MongoDB整合SpringBoot
1引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
2.yml文件配置
spring:
data:
mongodb:
uri: mongodb://fox:[email protected]:27017/user?authSource=admin
#uri等同于下面的配置
# database: user
# host: 127.0.0.1
# port: 27017
# username: fox
# password: fox
# authentication-database: admin
3.注入bean
@Autowired
MongoTemplate mongoTemplate;
4.使用
1.增删改集合
//集合的操作
@RequestMapping("/test1")
public void ok(){
//判断集合是否存在
boolean flag = mongoTemplate.collectionExists("emp");
if(flag){
//删除集合
mongoTemplate.dropCollection("emp");
}
//创建集合
MongoCollection<Document> emp1 = mongoTemplate.createCollection("emp");
}
//文档的查询操作
@RequestMapping("/test2")
public void test2(){
//=============普通查询====================
//查询出所有文档
List<User> list = mongoTemplate.findAll(User.class);
//根据ID查询
User us = mongoTemplate.findById(1, User.class);
//查询结果是多个,返回其中第一个
User u = mongoTemplate.findOne(new Query(), User.class);
//=============条件查询=====================
//构建查询条件
Query query1 = new Query(Criteria.where("salary").gte(8000));
Query query2 = new Query(Criteria.where("salary").gte(8000).lt(10000));
Query query3 = new Query(Criteria.where("name").regex("张")); //模糊匹配
//==============多条件查询===================
Criteria criteria1 = new Criteria();
Criteria criteria2 = new Criteria();
//and的条件
criteria1.andOperator(Criteria.where("age").gt(25),Criteria.where("salary").gt(8000));
//or的条件
criteria1.orOperator(Criteria.where("age").gt(25),Criteria.where("salary").gt(8000));
Query query = new Query(criteria1);
//sort排序
query.with(Sort.by(Sort.Order.desc("salary")));
//分页
query.skip(1).limit(10);
//查询出所有文档,第三个参数是集合名
List<User> list = mongoTemplate.findAll(query, TestUser.class, "test2");
}
//文档的更新操作
@RequestMapping("/test3")
public void test3(){
//先查询出要修改的
Query query = new Query(Criteria.where("salary").gte(8000));
User u = mongoTemplate.findOne(query, User.class);
Update update = new Update();
update.set("name","张三");
//UpdateResult()
//UpdateFirst()更新满足条件的第一条记录
//UpdateMulti()更新所有满足条件的记录
//upsert() 没有符合条件的记录则插入数据
UpdateResult updateResult = mongoTemplate.upsert(query, update, User.class);
//返回修改的记录数
System.out.println(updateResult.getModifiedCount());
}
2.查询
使用bson当作查询条件进行查询
//1.构造查询条件
Bson filters = Filters.and(
Filters.eq("deviceId", warningEvent.getDeviceId()),
Filters.gte("date", strTime.getTime()),
Filters.lte("date", endTime.getTime()),
Filters.eq("lastUpdateTime", DateUtil.format(updateDate, "yyyy-MM-dd HH:mm"))
);
//2.指定字段排序,升序或者降序
Bson sort = Sorts.ascending("name");
// Bson sort = Sorts.descending("name");
//3.指定返回字段
List<String> list = new ArrayList<>();
list.add("name");
list.add("age");
// Inclusion 包含了指定的字段和(隐式的)_id字段
// Exclusion 包含了指定的字段和(隐式的)_id字段
Bson fields = Projections.fields(Projections.include(list));
//4.去指定集合中进行查询
MongoCursor<Document> mongoCursor = mongoTemplate.getCollection("weatherall").find(filters).projection(fields).sort(sort).iterator();
while (mongoCursor.hasNext()) {
Document document = mongoCursor.next();
//3.根据字段名获取数据
wdspList.add(document.getDouble("name"));
wdirList.add(document.getDouble("age"));
//document.getInteger()
lstDate.add(DateUtil.format(new Date(document.getLong("date")), "yyyy-MM-dd HH:mm"));
}
边栏推荐
- Lepton 无损压缩原理及性能分析
- 区间 - 左闭右开
- Thymeleaf th:with局部变量的使用
- R language uses the polR function of mass package to build an ordered multi classification logistic regression model, and uses the coef function to obtain the log odds ratio corresponding to each vari
- 动态规划
- 家用电器行业商业供应链协同平台解决方案:供应链系统管理精益化,助推企业智造升级
- 申请代码签名证书时如何选择合适的证书品牌?
- LeetCode_ 67 (binary sum)
- CyCa children's physical etiquette Ningbo training results assessment came to a successful conclusion
- ASP. Net large takeout ordering system source code (PC version + mobile version + merchant version)
猜你喜欢
Microframe technology won the "cloud tripod Award" at the global Cloud Computing Conference!
循环不变式
SaaS multi tenant solution for FMCG industry to build digital marketing competitiveness of the whole industry chain
How can non-technical departments participate in Devops?
想进阿里必须啃透的12道MySQL面试题
Countermeasures of enterprise supply chain management system in UCA Era
超级哇塞的快排,你值得学会!
有一个强大又好看的,赛过Typora,阿里开发的语雀编辑器
ASP.NET大型外卖订餐系统源码 (PC版+手机版+商户版)
安装配置Jenkins
随机推荐
Qingda KeYue rushes to the science and Innovation Board: the annual revenue is 200million, and it is proposed to raise 750million
安装配置Jenkins
C language -- structure and function
04_ Use of solrj7.3 of solr7.3
注意!软件供应链安全挑战持续升级
useMemo,memo,useRef等相关hooks详解
美国费城发生“安全事故” 2名警察遭枪杀
leetcode:881. lifeboat
世界环境日 | 周大福用心服务推动减碳环保
【leetcode周赛总结】LeetCode第 81 场双周赛(6.25)
矩阵链乘 - 动态规划实例
CPU设计实战-第四章实践任务二用阻塞技术解决相关引发的冲突
FR练习题目---综合题
Share 20 strange JS expressions and see how many correct answers you can get
总量分析 核算方法和势方法 - 分摊分析
webRTC SDP mslabel lable
Thymeleaf th:classappend属性追加 th:styleappend样式追加 th:data-自定义属性
Sharing the 12 most commonly used regular expressions can solve most of your problems
周大福践行「百周年承诺」,真诚服务推动绿色环保
LeetCode_ 2 (add two numbers)