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" } ] }

切换数据库管理对象

  1. 启动客户端
    # ./mongo
    
  2. 使用admin数据库
    # use admin
    
  3. 登录
    # db.auth("mrfu","123")
    
  4. 切换到zhaoxi数据库下。在MongoDB中如果数据库不存在use时会新建数据库。
    # use test2
    
  5. 切换到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.数据库层面
  1. 新建数据库
    use testdb;	
    
  2. 显示所有数据库
    show dbs;
    
  3. 删除数据
    use testdb;	
    db.dropDatabase()
    
2.集合操作
  1. 创建集合
    # 数据库名
    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((可选)指定固定集合中包含文档的最大数量。
  1. 查看已有的集合
    show collections
    
  2. 插入集合
    db.集合名称.insert({"name" : "张三"}
    
    在这里插入图片描述
  3. 删除集合
    db.负差生.drop()
    
3.文档操作
插入文档
  1. 插入文档

    db.coll.insert({name:"张三"});
    db.coll.save({name:"张三"});
    db.coll.insertOne({name:"张三"})
    

    在这里插入图片描述

    当明确给定主键时,如果主键值已经存在save表示修改,insert/insertOne会报主键重复。。
    命令中_id是ObjectId类型,需要通过ObjectId函数把字符串转换为ObjectId

    db.coll.save({_id:ObjectId("5e81b3ac4d4d000026004f6a"),name:"jqk"})
    
  2. 插入多个文档

    db.coll.insert([{name:"a"},{name:"b"}]);
    db.coll.insertMany([{name:"a"},{name:"b"}]);
    db.coll.save([{name:"a"},{name:"b"}]);
    
更新文档
  1. 更新文档

    db.COLLECTION_NAME.update({查询条件},{更新内容},{更新参数(可选)})
    
  2. 单一更新文档

    db.coll.update({name:"张三"},{name:"王五"})
    

    在这里插入图片描述

  3. $Set操作符更新多条文档
    默认更新一条数据如果需要更新多条数据需要指定Set参数和multi参数

    db.coll.update({name:"张三"},{$set:{name:"王五"}},{multi:true})
    

    在这里插入图片描述
    倘若更新的字段不存在,mongodb会自动将字段添加上,删除的话会自动的删除字段

    db.coll.update({name:"王五"},{$set:{name:"王五",age:"123"}},{multi:true})
    

    在这里插入图片描述

  4. $inc操作符 自增自见
    对字符进行增加或者减少

    db.coll.update({name:"王五"},{$set:{state:123}},{multi:true});
    db.coll.update({name:"王五"},{$inc:{state:-5}});
    

    在这里插入图片描述

  5. $inc操作符 删除
    主要是用来删除键。让键的值为空。在编写命令时unset里field取值任意,无论给定什么值都表示删除

    db.coll.update({name:"王五"},{$state:{:"随意"}});
    

    在这里插入图片描述
    8.$push操作符 添加数组
    用一个failed存储数组。

     db.coll.update({},{$push:{hobby:"3331"}},{multi:true});
    

    在这里插入图片描述

  6. $pop操作符 删除数组数据元素
    删除数据元素。可取值只能是1或-1。1表示尾部删除,-1表示头部删除

    db.coll.update({name:"李四"},{$pop:{hobby:-1}})
    
  7. $pull操作符
    从数组中删除满足条件的元素,只要满足条件都删除。

    db.coll.update({name:"王五"},{$pull:{hobby:"3331"}});
    
  8. $rename
    对键进行重新命名。任何类型的键都能重命名。

    db.coll.update({name:"王五"},{$rename:{name:"username"}});
    

    在这里插入图片描述

  9. $pullAll操作符
    删除王五中数组中等于333,3331

    db.coll.update({name:"王五"},{$pullAll:{hobby:["333","3331"]}});
    

    在这里插入图片描述

查询文档
  1. 查询所有
    db.coll.find();
    
  2. 查询为张三的
    	db.coll.find({name:"张三"}
    
投影操作

投影查询指的就是哪些列被显示或不被显示。写到投影(projection)里面的属性可取值为1(显示)或0(不显示)。除了_id以外其他属性取值必须是相同。

  1. sex和hobby不显示
    db.coll.find({name:"王五"},{sex:0,hobby:0})
    
  2. sex和hobby不显示
    db.coll.find({name:"王五"},{sex:0,hobby:0})
    
  3. 显示sex和hobby,默认_id也是显示
    db.coll.find({name:"张三"},{sex:1,hobby:1})
    
  4. 显示sex和hobby,_id不显示
    db.coll.find({name:"张三"},{_id:0sex:1,hobby:1})
    
  5. findOne()
    返回第一行document对象。
    db.coll.findOne();
    db.coll.findOne({name:"张三"}   #返回为张三的第一天数据
    
  6. 查询包含小写b的文档对象
    db.coll.find({name:/b/});  #正则表达式不用输入""输入//
    
  7. $regex 只要包含b或B都能查询出来
    db.coll.find({name:{$regex:/b/,$options:"i"}});  
    
条件操作符
  1. 大于
    db.coll.find({age:{$gt:10}});
    
  2. 小于
    db.coll.find({age:{$lt:10}})
    
  3. 等于
    db.coll.find({age:{$eq:2}})
    
  4. 不等于
    db.coll.find({age:{$ne:8}});
    
  5. 大于或等于
    db.coll.find({age:{$gte:8}});
    
  6. 小于或等于
    db.coll.find({age:{$lte:8}});
    
  7. 包含
    db.coll.find({age:{$in:[8,10,12]}}
    
  8. 不包含
    db.coll.find({age:{$nin:[8,10,12]}}
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值