mongoDB学习笔记(正在完善中)
1. 打开mongo shell
$ mongo
2. 添加超级管理员账户
> use admin 切换到admin数据库
> db.createUser({user: 'myadmin', pwd: 'myadmin', roles:[{role: 'userAdminAnyDatabase', db:'admin'}]})
3. 验证用户
> db.auth(username, password)
4. 执行查看命令(执行下面命令必须验证用户)
> show users 查看用户是否创建成功【必须使用管理员账户】
> show dbs 查看数据库列表
> show collections 查看集合列表
mongodb 有哪些权限:
read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限
注意:此时新创建的数据库并不在列表中,必须要插入至少一条数据才会显示
插入数据之前,需要给新的数据库添加管理用户
db.createUser({user: 'test', pwd: 'test', roles:[{role: 'readWrite', db: 'wll'}]})
注意:如果已经验证过用户,是不能直接验证其他用户,否则会报错:logical sessions can't have multiple authenticated users,mongDB不允许一次会话认证多个用户
解决方案:退出当前shell窗口,或者新建shell窗口,重新认证auth认证登录
- 重新登录mongoDB后,
- 切换到目标数据库 use wll
- 验证用户 db.auth(‘test’, ‘test’)
- 最后就可以正常执行命令
数据库操作
选择和创建数据库 use 数据库名称
> use database_name
> use wll
注意:如果数据库不存在则自动创建
查看有权限查看的所有的数据库命令: show dbs 或者 show databases
查看当前正在使用的数据库命令 db
mongoDB中默认的数据库为test
删除数据库 db.dropDatabase()
特殊作用的数据库:
admin
local
config
数据库名可以是满足以下条件的任意UTF-8字符串。
不能是空字符串(“”)。
不得含有’ '(空格)、.、$、/、\和\0 (空字符)。
应全部小写。
最多64字节。
集合操作
显示创建 db.createCollection(name)
隐式创建: 当向一个集合中插入一个文档的时候,如果集合不创建则会自 动创建集合
查看当前集合中的所有集合 show collections 或 show tables
集合的删除: db.collection.drop() 或 db.集合.drop()
集合的命名规范:
1. 集合名不能是空字符串""。
2. 集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
3. 集合名不能以"system."开头,这是为系统集合保留的前缀。
4. 用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。
查询语句
以集合movie为例进行查询操作
查询所有记录 db.movie.find();
db.userInfo.find({"age": 22}); age=22
db.userInfo.find({age: {$gt: 22}}); age>22
db.userInfo.find({age: {$gte: 25}});
db.userInfo.find({age: {$gte: 23, $lte: 25}}); age>=23 and age <= 25
db.userInfo.find({age: {$ne: 25}});
查询 name 中包含 mongo 的数据 模糊查询用于搜索
db.userInfo.find({name: /mongo/});
查询指定列 name、age 数据, age > 25
db.userInfo.find({age: {$gt: 25}}, {name: 1, age: 1});
排序sort:
按照年龄排序 1 升序 -1 降序
升序:db.userInfo.find().sort({age: 1});
Limit 限制返回条数
查询前 5 条数据
db.userInfo.find().limit(5);
查询 10 条以后的数据
db.userInfo.find().skip(10);
查询在 6-10条 之间的数据
db.userInfo.find().limit(10).skip(5);
or 查询
db.userInfo.find({$or: [{age: 22}, {age: 25}]});
and 查询
name = zhangsan, age = 22 的数据
db.userInfo.find({name: 'zhangsan', age: 22});
统计数量
db.userInfo.find({age: {$gte: 25}}).count();
文档基本CRUD
文档的插入
(1)单个文档插入 insert或save db.collection.insert({...})
(2)批量插入 db.collection.insertMany( [ <document 1> , <document 2>, … ], { writeConcern: , ordered: } )
测试用例:
db.comment.insertMany([ {"_id":"1","articleid":"100001","content":"我们不应该把清晨浪费在手机上,健康很重要,一杯温水幸福你我 他。","userid":"1002","nickname":"相忘于江湖","createdatetime":new Date("2019-08- 05T22:08:15.522Z"),"likenum":NumberInt(1000),"state":"1"}, {"_id":"2","articleid":"100001","content":"我夏天空腹喝凉开水,冬天喝温开水","userid":"1005","nickname":"伊人憔 悴","createdatetime":new Date("2019-08-05T23:58:51.485Z"),"likenum":NumberInt(888),"state":"1"}, {"_id":"3","articleid":"100001","content":"我一直喝凉开水,冬天夏天都喝。","userid":"1004","nickname":"杰克船 长","createdatetime":new Date("2019-08-06T01:05:06.321Z"),"likenum":NumberInt(666),"state":"1"}, {"_id":"4","articleid":"100001","content":"专家说不能空腹吃饭,影响健康。","userid":"1003","nickname":"凯 撒","createdatetime":new Date("2019-08-06T08:18:35.288Z"),"likenum":NumberInt(2000),"state":"1"}, {"_id":"5","articleid":"100001","content":"研究表明,刚烧开的水千万不能喝,因为烫 嘴。","userid":"1003","nickname":"凯撒","createdatetime":new Date("2019-08- 06T11:01:02.521Z"),"likenum":NumberInt(3000),"state":"1"} ]);
删除
1. 删除文档 db.集合名称.remove(条件)
删除_id=1的记录 db.comment.remove({_id:”1”})
2. 删除集合 db.collection.drop()
3. 删除数据库 db.dropDatabase() 删除当前数据库
文档的分页查询
(1)统计查询 count
统计所有记录
按条件统计记录数
分页列表查询
可以使用limit()方法来读取指定数量的数据,使用skip()方法来跳过指定数量的数据。 db.comment.find().limit(3)
(2)排序查询
sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。db.comments.find().sort({userid:-1, likenum:1})
注意: skip(), limilt(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit(),和命令编写顺序无关。
参考博客
https://blog.csdn.net/qq_41767116/article/details/125586683
https://www.cnblogs.com/0722tian/p/16461446.html
https://blog.csdn.net/qq_44300280/article/details/123937014
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通