勿以浮沙筑高台
MongoDB基础概念和基础操作
MongoDB是什么
MongoDB也是一种NoSQL数据,面向文档的数据库,意思是一个文档文件就是一个数据库,在我们创建的data文件夹下就可以看见以.wt结束的文档,即文档数据库。
在NoSQL数据库当中,它介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最像关系数据库的产品,数据结构类似JSON的BJSON格式,因此可以像关系数据库一样存储复制存储内心。
Linux下的MongoDB安装
请阅读:Linux下MongoDB安装
MongoDB基本操作
管理用户概念和用户操作
mongodb有一个用户管理机制,简单描述为,有一个管理用户组,这个组的用户是专门为管理普通用户而设的,暂且称之为管理员。管理员没有操作权限,只有操作用户的权限,因此我们需要创建一个用户对象来对数据库进行操作。
只有对应的角色才能有操作对象,MongoDB的角色有如下:
Read:允许用户读取指定数据库 readWrite:允许用户读写指定数据库 dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户 。
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限。
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库
的读写权限 。
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限。
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限。
1.创建管理员对象
db.createUser({user:'mrfu',pwd:'123',roles:
[{role:'userAdminAnyDatabase',db:'admin'}]})
user:用户名,pwd:密码,roles:用户对象。role:用户角色,db:管理数据库对象。
成功:
2.退出MongoDB
退出Mongodb并开启权限,开启权限需要到conf/MongoDB.conf下开启。
security:
authorization: enabled
记住要顶格!!!
3.重新登录
重启服务登录后,发现提升没有权限。
[root@work1 bin]# ./mongo
MongoDB shell version v4.4.2
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("022dba07-308f-4cde-b510-1203df8cc430") }
MongoDB server version: 4.4.2
切到admin数据库,查看字段,提示没有权限
> use admin
switched to db admin
> db.systems.users.find()
Error: error: {
"ok" : 0,
"errmsg" : "command find requires authentication",
"code" : 13,
"codeName" : "Unauthorized"
}
登录后查看成功。
> db.auth('mrfu','123')
1
> db.system.users.find();
{ "_id" : "admin.mrfu", "userId" : UUID("66d10395-6761-4351-9c16-990171b20783"), "user" : "mrfu", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "kH1+7ltfRkQJImbXiu5NYg==", "storedKey" : "KKKKYxRujJGVaxYk8N8UNQFnahc=", "serverKey" : "av/fEst4VuN9LIy3Yv0jWuq3wQE=" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "NoMBZVXcmtsZaNj7Q4WpBoHFPYTcalNmGY6L7w==", "storedKey" : "0Mjl7jN264Uvr4bqUB9j1MWDc9jTZzQWpausCQ4JQGU=", "serverKey" : "PbGdZXhu9nAgeNaZY4bnJJOdPcRE7POyaW2djwaKAPY=" } }, "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] }
切换数据库管理对象
- 启动客户端
# ./mongo
- 使用admin数据库
# use admin
- 登录
# db.auth("mrfu","123")
- 切换到zhaoxi数据库下。在MongoDB中如果数据库不存在use时会新建数据库。
# use test2
- 切换到admin下,创建操作员
# use admin # db.createUser({user:"mrfu",pwd:"123",roles: [{role:"readWrite",db:"test2"}]});
MongoDBCRUD操作
为了方便创建一个超级管理员root,来操作。
> db.createUser({user:'root',pwd:'123',roles:
... [{role:'root',db:'admin'}]})
Successfully added user: {
"user" : "root",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
1.数据库层面
- 新建数据库
use testdb;
- 显示所有数据库
show dbs;
- 删除数据
use testdb; db.dropDatabase()
2.集合操作
- 创建集合
# 数据库名 use 数据库; db.createCollection(集合名称,options); # 实例 > db.createCollection("mycol", { capped : true, autoIndexId : true, size : 6142800, max : 10000 } ) { "ok" : 1 }
名称 | 意思 |
---|---|
capped | (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为 true 时,必须指定 size 参数。 |
autoIndexId | (可选)如为 true,自动在 _id 字段创建索引。默认为 false。 |
size | (可选)为固定集合指定一个最大值,以千字节计(KB)。 如果 capped为 true,也需要指定该字段。 |
max | ((可选)指定固定集合中包含文档的最大数量。 |
- 查看已有的集合
show collections
- 插入集合
db.集合名称.insert({"name" : "张三"}
- 删除集合
db.负差生.drop()
3.文档操作
插入文档
-
插入文档
db.coll.insert({name:"张三"}); db.coll.save({name:"张三"}); db.coll.insertOne({name:"张三"})
当明确给定主键时,如果主键值已经存在save表示修改,insert/insertOne会报主键重复。。
命令中_id是ObjectId类型,需要通过ObjectId函数把字符串转换为ObjectIddb.coll.save({_id:ObjectId("5e81b3ac4d4d000026004f6a"),name:"jqk"})
-
插入多个文档
db.coll.insert([{name:"a"},{name:"b"}]); db.coll.insertMany([{name:"a"},{name:"b"}]); db.coll.save([{name:"a"},{name:"b"}]);
更新文档
-
更新文档
db.COLLECTION_NAME.update({查询条件},{更新内容},{更新参数(可选)})
-
单一更新文档
db.coll.update({name:"张三"},{name:"王五"})
-
$Set操作符更新多条文档
默认更新一条数据,如果需要更新多条数据需要指定Set参数和multi参数db.coll.update({name:"张三"},{$set:{name:"王五"}},{multi:true})
倘若更新的字段不存在,mongodb会自动将字段添加上,删除的话会自动的删除字段db.coll.update({name:"王五"},{$set:{name:"王五",age:"123"}},{multi:true})
-
$inc操作符 自增自见
对字符进行增加或者减少db.coll.update({name:"王五"},{$set:{state:123}},{multi:true}); db.coll.update({name:"王五"},{$inc:{state:-5}});
-
$inc操作符 删除
主要是用来删除键。让键的值为空。在编写命令时unset里field取值任意,无论给定什么值都表示删除db.coll.update({name:"王五"},{$state:{:"随意"}});
8.$push操作符 添加数组
用一个failed存储数组。db.coll.update({},{$push:{hobby:"3331"}},{multi:true});
-
$pop操作符 删除数组数据元素
删除数据元素。可取值只能是1或-1。1表示尾部删除,-1表示头部删除db.coll.update({name:"李四"},{$pop:{hobby:-1}})
-
$pull操作符
从数组中删除满足条件的元素,只要满足条件都删除。db.coll.update({name:"王五"},{$pull:{hobby:"3331"}});
-
$rename
对键进行重新命名。任何类型的键都能重命名。db.coll.update({name:"王五"},{$rename:{name:"username"}});
-
$pullAll操作符
删除王五中数组中等于333,3331db.coll.update({name:"王五"},{$pullAll:{hobby:["333","3331"]}});
查询文档
- 查询所有
db.coll.find();
- 查询为张三的
db.coll.find({name:"张三"}
投影操作
投影查询指的就是哪些列被显示或不被显示。写到投影(projection)里面的属性可取值为1(显示)或0(不显示)。除了_id以外其他属性取值必须是相同。
- sex和hobby不显示
db.coll.find({name:"王五"},{sex:0,hobby:0})
- sex和hobby不显示
db.coll.find({name:"王五"},{sex:0,hobby:0})
- 显示sex和hobby,默认_id也是显示
db.coll.find({name:"张三"},{sex:1,hobby:1})
- 显示sex和hobby,_id不显示
db.coll.find({name:"张三"},{_id:0sex:1,hobby:1})
- findOne()
返回第一行document对象。db.coll.findOne(); db.coll.findOne({name:"张三"} #返回为张三的第一天数据
- 查询包含小写b的文档对象
db.coll.find({name:/b/}); #正则表达式不用输入""输入//
- $regex 只要包含b或B都能查询出来
db.coll.find({name:{$regex:/b/,$options:"i"}});
条件操作符
- 大于
db.coll.find({age:{$gt:10}});
- 小于
db.coll.find({age:{$lt:10}})
- 等于
db.coll.find({age:{$eq:2}})
- 不等于
db.coll.find({age:{$ne:8}});
- 大于或等于
db.coll.find({age:{$gte:8}});
- 小于或等于
db.coll.find({age:{$lte:8}});
- 包含
db.coll.find({age:{$in:[8,10,12]}}
- 不包含
db.coll.find({age:{$nin:[8,10,12]}}