网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
3.1.新增
insert
insertOne
insertMany
3.2.更新
替换更新
db.users.update({“username”:“lison”},{“country”:“USA”})
操作符更新
db.users.update({“username”:“james”},{“$set”:{“country”:“USA”}})
query 查询条件,类似 sql update 查询内 where 后面的;
update的对象和一些更新的操作符(如$, $inc
…)等,也可以理解为 sql update 查询内 set 后面的
$inc
指定值自增
$set
更新指定字段
$unset
将指定字段删除
$rename
更新字段名称
$
定位到某一个元素
$push
添加值到数组中,默认放在数组最后
$addToSet
添加值到数组中,有重复则不处理
$pop
删除数组第一个或者最后一个
$pull
从数组中删除匹配查询条件的值
$pullAll
从数组中删除多个值
$each 与$push 和$addToSet
等一起使用来操作多个值
$slice 与$push 和$each
一起使用来操作用来缩小更新后数组的大小
$sort 与$push、$each 和$slice
一起使用来对数组进行排序
1.upsert
可选,这个参数的意思是,如果不存在 update 的记录,是
否插入,true 为插入,默认是 false,不插入
2.multi
可选,mongodb 默认是 false,只更新找到的第一条记录,如
果这个参数为 true,就把按条件查出来多条记录全部更新
3.writeConcern
可选,写策略配置。
注意
mongodb 的更新都是
原子
的,mongodb 所有的写操作都是有锁的。mongoDB2.2 之前锁级别为实例级别,mongoDB 2.2 到 3.2 之前的版本锁级别为数据库级别,mongoDB 3.2 以后,WiredTiger
的锁级别是文档级别;
findAndModify
命令:在同一往返过程中原子更新文档并返回它;
3.3.删除(不会删除索引)
deleteOne
deleteMany
3.4.查询
3.4.1.常用查询选择器
范围
$eq
等于
$lt
小于
$gt
大于
$lte
小于等于
$gte
大于等于
$in
判断元素是否在指定的集合范围里 db.users.find({“username”:{" KaTeX parse error: Expected ‘EOF’, got ‘}’ at position 30: …mark", “james”]}̲}).pretty()查询姓名…all` 判断数组中是否包含某几个元素,无关顺序;
$nin 判断元素是否不在指定的集合范围里
布尔运算
$ne
不等于,不匹配参数条件
$not
不匹配结果db.users.find({"lenght":{"$not":{"$gte":1.77}}}).pretty()
查询高度小于 1.77 或者没有身高的人 not 语句 会把不包含查询语句字段的文档 也检索出来
$or
有一个条件成立则匹配
$nor
所有条件都不匹配
$and
所有条件都必须匹配
$exists
判断元素是否存在db.users.find({"lenght":{"$exists":true}}).pretty()
判断文档有没有关心的字段
其他
. 子文档匹配
$regex 正则表达式匹配
3.4.2.普通查询
映射
字段选择并排除其他字段:
db.users.find({},{'username':1})
字段排除:db.users.find({},{'username':0})
排序
sort()
:db.users.find().sort({“username”:1}).pretty() 1:升序 -1:降序
跳过和限制
skip(n)
:跳过 n 条数据
limit(n)
:限制 n 条数据
eg:db.users.find().sort({"username":1}).limit(2).skip(2)
查询唯一值
distinct()
:查询指定字段的唯一值,e.g:db.users.distinct(“username”)
示例
db.collection.find(query, projection)
db.users.find({“KaTeX parse error: Expected 'EOF', got '}' at position 39: …n"},{"age":18}]}̲,{"username":0,…and”:[{“username”:“lison”},{“age”:18}]},{“username”:0,“age”:0})
3.4.3.数组查询
字符串数组
数组单元素查询
db.users.find({“favorites.movies”:“蜘蛛侠”})
查询数组中包含"蜘蛛侠"
数组精确查找
db.users.find({“favorites.movies”:[ “杀破狼 2”, “战狼”, “雷神1” ]},{“favorites.movies”:1})
查询数组等于[ “杀破狼 2”, “战狼”, “雷神 1” ]的文档,严格按照数量、顺序;
数组多元素查询
db.users.find({“favorites.movies”:{" $all":[ “雷神 1”, “战狼” ]}},{“favorites.movies”:1})
查询数组包含[“雷神 1”, “战狼” ]的文档,跟顺序无关,跟数量有关
db.users.find({“favorites.movies”:{" $in":[ “雷神 1”, “战狼” ]}},{“favorites.movies”:1})
查询数组包含[“雷神 1”, “战狼” ]中任意一个的文档,跟顺序无关,跟数量无关
索引查询
db.users.find({“favorites.movies.0”:“妇联 4”},{“favorites.movies”:1})
查询数组中第一个为"妇联 4"的文档返回数组子集
db.users.find({},{“favorites.movies”:{“$slice”:[1,2]},“favorites”:1})
$slice 可以取两个元素数组,分别表示跳过和限制的条数;
对象数组
单元素查询
db.users.find({“comments”:{“author” : “lison6”,“content” : “lison 评论6”,“commentTime” :ISODate(“2017-06-06T00:00:00Z”)}})
备注:对象数组精确查找
查找 1 lison1 者 或者 2 lison12 评论过的 r user (n $in 查找符)
db.users.find({“comments.author”:{“$in”:[“lison1”,“lison12”]}}).pretty()
备注:跟数量无关,跟顺序无关;
查找 1 lison1 和 和 2 lison12 都评论过的 user
db.users.find({“comments.author”:{“$all”:[“lison12”,“lison1”]}}).pretty()
备注:跟数量有关,跟顺序无关;
查找 5 lison5 评语为包含" " 苍老师" " 关键字的 user (h $elemMatch 查找符)
db.users.find({“comments”:{" $elemMatch":{“author” : “lison5”,
“content” : { " $regex" : “. 苍老师 .”}}}}) .pretty()
备注:数组中对象数据要符合查询对象里面所有的字段, $ 全元素匹配,和顺序无关;
3.4.4.聚合查询
db.collection.aggregate()
$project
:投影,指定输出文档中的字段;
$match
:用于过滤数据,只输出符合条件的文档。m
a
t
c
h
使
用
M
o
n
g
o
D
B
的
标
准
查
询
操
作
‘
match 使用 MongoDB 的标准查询操作 `
match使用MongoDB的标准查询操作‘limit
:用来限制 MongoDB 聚合管道返回的文档数。
s
k
i
p
‘
:
在
聚
合
管
道
中
跳
过
指
定
数
量
的
文
档
,
并
返
回
余
下
的
文
档
。
‘
skip
:在聚合管道中跳过指定数量的文档,并返回余下的文档。
skip‘:在聚合管道中跳过指定数量的文档,并返回余下的文档。‘unwind
:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
g
r
o
u
p
‘
:
将
集
合
中
的
文
档
分
组
,
可
用
于
统
计
结
果
。
‘
group
:将集合中的文档分组,可用于统计结果。
group‘:将集合中的文档分组,可用于统计结果。‘sort`:将输入文档排序后输出。
四、角色安全控制
4.1.角色分类
4.1.1.数据库一般角色( Databaser User Roles )
每个数据库都包含的一般角色;
read
提供读取所有非系统集合和部分系统集合的数据的能力,系统集合包括:
system.indexes,system.js 和 system.namespaces 集合。
readWrite
提供 read 角色的所有权限以及修改所有非系统集合和 system.js 集合上的数据的能力。
4.1.2.数据库管理角色(Database Administration Roles)
每个数据库都包含的数据库管理角色;
dbAdmin
提供执行管理任务的能力,如与模式相关的任务,索引,收集统计信息。 此角色不授予用户和角色管理的权限。
userAdmin
提供在当前数据库上创建和修改角色和用户的能力。
dbOwner
提供对数据库执行任何管理操作的能力。 此角色结合了
readWrite,dbAdmin和 userAdmin
角色授予的权限。
4.1.3.集群管理角色(Cluster Administration Roles )
在 admin 数据库创建,用于管理整个数据库集群系统而不是特定数据库的角色。
这些角色包括但不限于副本集和分片群集管理功能。
clusterManager
在集群上提供管理和监视操作。 具有此角色的用户可以分别访问在分片和复制中使用的 config 和 local 数据库。
clusterMonitor
为监控工具(如 MongoDB Cloud Manager 和 Ops Manager 监控代理)提供只读访问权限。
hostManager
提供监视和管理服务器的能力。
clusterAdmin
提供权限最高的群集管理访问。 此角色结合了由
clusterManager,clusterMonitor 和 hostManager
角色授予的权限。 此外,该角色还提供了
dropDatabase
操作。
4.1.4.备份和恢复角色(Backup and Restoration Roles )
在 admin 数据库创建,用于专门的备份和恢复的角色
backup
提供备份数据所需的权限。 此角色提供足够的权限来使用 MongoDB Cloud Manager 备份代理,Ops Manager 备份代理或使用 mongodump。
restore
提供使用
mongorestore
恢复数据所需的权限
4.1.5.全数据库角色(All-Database Roles )
在 admin 数据库创建,适用于除 mongod 实例中的 local 和 config 之外的所有数据库:
readAnyDatabase
提供与读取相同的只读权限,除了适用于群集中除本地和配置数据库以外的所有权限。 该角色还提供了整个集群上的 listDatabases 操作。
readWriteAnyDatabase
提供与 readWrite 相同的读取和写入权限,除了它适用于群集中除本地和配置数据库以外的所有数据。 该角色还提供了整个集群上的 listDatabases 操作。
userAdminAnyDatabase
提供与 userAdmin 相同的用户管理操作访问权限,除了适用于群集中除本地数据库和配置数据库外的所有数据。
dbAdminAnyDatabase
提供与 dbAdmin 相同的数据库管理操作访问权限,除了它适用于除集群中的本地数据库和配置数据库以外的所有数据库管理操作。 该角色还提供了整个集群上的
listDatabases
操作。
4.1.6.超级角色(r Superuser Roles )
所有资源的完整权限
root
提供对
readWriteAnyDatabase,dbAdminAnyDatabase,userAdminAnyDatabase,clusterAdmin
,还原和备份相结合的操作和所有资源的访问。
4.2.mogno 服务开启安全认证方式
1.服务器启动加上 auth 参数,开启安全验证
./mongod -f mongodb.conf --auth
2.数据库增加安全模式后,初始化一个“userAdminAnyDatabase“,通过客户端连接,使用admin 数据库, 执行脚本db.createUser({'user':'boss', 'pwd':'boss','roles':[{'role':'userAdminAnyDatabase', 'db':'admin'}]})
3.使用刚创建成功的用户登录:db.auth("boss","boss");
4.切换到 lison 数据库,创建读写权限用户
use lison
db.createUser
({‘user’:‘lison’,‘pwd’:‘lison’,‘roles’:[{‘role’:‘readWrite’,‘db’:‘lison’}]})
5.使用读写权限用户 lison 登录,db.auth(“lison”,“lison”),登录后测试;
4.3.代码安全模式连接方式
Spring
<mongo:mongo-client host=“192.168.1.142” port=“27022” credentials=“lison:lison@lison”>
</mongo:mongo-client>
Java
public void init() {
MongoCredential createCredential = MongoCredential.createCredential(“lison”, “lison”,“lison”.toCharArray());
MongoClientOptions mco = MongoClientOptions.builder()
.writeConcern(WriteConcern.JOURNALED)
.connectionsPerHost(100)
.readPreference(ReadPreference.secondary())
.threadsAllowedToBlockForConnectionMultiplier(5)
.maxWaitTime(120000).connectTimeout(10000).build();
List asList = Arrays.asList(new ServerAddress(“116.62.222.124”,27022));
this.client = new MongoClient(asList, createCredential,mco);
db = client.getDatabase(“lison”);
collection = db.getCollection(“users”);
}
五、MongoDB高级知识
5.1.存储引擎
5.1.1.MMAPV1
在 3.2 版本之前 MMAPV1 是默认的存储引擎
5.1.2.wiredTiger
3.4 以上版本默认的存储引擎是 wiredTiger,相对于 MMAPV1 其有如下优势:
读写操作性能更好,WiredTiger 能更好的发挥多核系统的处理能力;
MMAPV1
引 擎 使 用 表 级 锁 ,当 某 个 单 表 上 有 并 发 的 操 作 ,吞 吐 将 受 到 限 制 。
WiredTiger
使用文档级锁,由此带来并发及吞吐的提高,相比MMAPV1
存储索引时WiredTiger
使用前缀压缩,更节省对内存空间的损耗;
提供压缩算法,可以大大降低对硬盘资源的消耗,节省约 60%以上的硬盘资源;
5.1.2.1.写入数据原理
5.1.2.2.Journaling
3.4 以上版本默认的存储引擎是 wiredTiger,相对于 MMAPV1 其有如下优势:
读写操作性能更好,WiredTiger 能更好的发挥多核系统的处理能力;
MMAPV1
引 擎 使 用 表 级 锁 ,当 某 个 单 表 上 有 并 发 的 操 作 ,吞 吐 将 受 到 限 制 。
WiredTiger
使用文档级锁,由此带来并发及吞吐的提高,相比MMAPV1
存储索引时WiredTiger
使用前缀压缩,更节省对内存空间的损耗;
提供压缩算法,可以大大降低对硬盘资源的消耗,节省约 60%以上的硬盘资源;
5.1.2.3.写策略配置
写配置说明
Java 代码实现写策略
Q1:写策略配置相关的类是?
答:com.mongodb.WriteConcern
,其中有如下几个常用写策略配置:
UNACKNOWLEDGED:不等待服务器返回或确认,仅可以抛出网络异常;
ACKNOWLEDGED:默认配置,等待服务器返回结果;
JOURNALED:等待服务器完成 journal 持久化之后返回;
W1 :等待集群中一台服务器返回结果;
W2 :等待集群中两台服务器返回结果;
W3 :等待集群中三台服务器返回结果;
MAJORITY:等待集群中多数服务器返回结果;
Q2:Java 代码中如何加入写策略
答:Java 客户端可以按两种方式来设置写策略:
在 MongoClient初始化过程中使用 MongoClientOptions.writeConcern(writeConcern)
来进行配置;
在写操作过程中,也可动态的指定写策略,mongodb 可以在三个层次来进行写策略的配置,既 MongoClient、 MongoDatabase 、MongoCollection
这三个类都可以通过 WriteConcern
方法来设置写策略;
Spring 中如何配置写策略?
<mongo:mongo-client id=“mongo” host=“127.0.0.1” port=“27017” >
<mongo:client-options write-concern=“NONE”/>
</mongo:mongo-client>
配置文件配置引擎
storage:
journal:
enabled: true
dbPath: /data/zhou/mongo1/
##是否一个库一个文件夹
directoryPerDB: true
##数据引擎
engine: wiredTiger
##WT 引擎配置
wiredTiger:
engineConfig:
##WT 最大使用 cache(根据服务器实际情况调节)
cacheSizeGB: 1
##是否将索引也按数据库名单独存储
directoryForIndexes: true
journalCompressor:none (默认 snappy)
##表压缩配置,性能: none>snappy>zlib,压缩比:zlib>snappy>none
collectionConfig:
blockCompressor: zlib (默认 snappy,还可选 none、zlib)
##索引配置
indexConfig:
prefixCompression: true
5.2.索引
5.2.1.索引管理
新增db.collection.createIndex(keys, options)
语法中 Key 值为要创建的索引字段,1 为指定按升序创建索引,如果你想按降序来创建索引指定为-1,也可以指定为 hashed(哈希索引)。
语法中 options 为索引的属性,属性说明见下表
属性名 | 类型 | 说明 |
---|---|---|
background | boolean | 是否后台构建索引,在生产环境中,如果数据量太大,构建索引可能会消耗很长时间,为了不影响业务,可以加上此参数,后台运行同时还会为其他读写操作让路 |
unique | boolean | 是否为唯一索引 |
name | string | 索引名字 |
sparse | boolean | 是否为稀疏索引,索引仅引用具有指定字段的文档。 |
单键唯一索引:db.users.createIndex({username :1},{unique:true});
单键唯一稀疏索引:db.users. createIndex({username :1},{unique:true,sparse:true});
复合唯一稀疏索引:db.users. createIndex({username:1,age:-1},{unique:true,sparse:true});
创建哈希索引并后台运行:db.users. createIndex({username :‘hashed’},{background:true});
删除
根据索引名字删除某一个指定索引:db.users.dropIndex(“username_1”);
删除某集合上所有索引:db.users.dropIndexs();
重建某集合上所有索引:db.users.reIndex();
查询集合上所有索引:db.users.getIndexes();
5.2.2.索引分类
单键索引
在某一个特定的属性上建立索引,例如:
db.users. createIndex({age:-1});
mongoDB 在 ID 上建立了唯一的单键索引,所以经常会使用 id 来进行查询;
在索引字段上进行精确匹配、排序以及范围查找都会使用此索引;
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
rue});
复合唯一稀疏索引:db.users. createIndex({username:1,age:-1},{unique:true,sparse:true});
创建哈希索引并后台运行:db.users. createIndex({username :‘hashed’},{background:true});
删除
根据索引名字删除某一个指定索引:db.users.dropIndex(“username_1”);
删除某集合上所有索引:db.users.dropIndexs();
重建某集合上所有索引:db.users.reIndex();
查询集合上所有索引:db.users.getIndexes();
5.2.2.索引分类
单键索引
在某一个特定的属性上建立索引,例如:
db.users. createIndex({age:-1});
mongoDB 在 ID 上建立了唯一的单键索引,所以经常会使用 id 来进行查询;
在索引字段上进行精确匹配、排序以及范围查找都会使用此索引;
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
[外链图片转存中…(img-Ng4oATs0-1715386283155)]
[外链图片转存中…(img-UuCVS9C0-1715386283155)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新