首先还是先介绍一下我们的大家族NoSQL吧
NoSQL只是他的缩写。他的中文名是非关系数据库,外文名NotOnlySQL。它是关系数据库(RDBMS)的补充。RDBMS在数据存储和查询上追求高度结构化和严格的数据一致性;NOSQL不在乎形式,注重效率。NOSQL是一个高性能、无模式和高度可扩展的分布式数据库。NOSQL存储包括四种类型:键值对存储、列存储、文档存储和图形数据存储。这里简单介绍一下NoSQL,这不是今天的重点。还是把重点放在我自己(MongoDb)吧,呵呵!
MongoDb自我介绍
MongoDb是面向文档存储的键值对NOSQL数据库,是最接近关系数据库的非关系数据库。Bjorsn(类似于JSON)结构用于数据存储结构和查询。Bjorsn支持多层机构,在具体使用过程中更像是操作Javascript脚本。由于MongoDb的非模态性,在实际应用中变得更加灵活,易于扩展。和RDBMS一样,支持主键、索引、检索等操作,但由于其非结构化的结构,不支持连接查询。
MongoDb的基本概念
具体的数据库安装就不介绍了,不过网上搜索一下会有很大的推动。MongoDb使用BJON文档存储,所以它的基本结构概念可以和JSON联系起来:字段、文档、集合、数据库,和RDBMS的属性、列、表、数据库一一对应。这里有一个表格进行比较和解释:
RDBMS
MongoDb
概念说明
数据库数据库
桌子桌子
收藏收藏
行行
文档文档:相应的BJSON
列Column
field field:BJSON中的特定字段。
单纯的表格展示不够直观,那我们就拿一张图片来说明一下吧!
用户权限管理
在生产环境的数据库管理中,数据库权限是一个非常重要的功能。在具体权限方面,既要对整个世界的权限进行控制,又要精确到具体数据。具体权限方面,包括:读、写、管理员等权限。下面的列表描述了mongodb的内置权限:
权限名称
权限说明
Read允许用户读取指定的数据库。readWrite允许用户读写指定的数据库。dbAdmin允许用户在指定的数据库中执行管理功能,如创建和删除索引、查看统计信息或访问system.profileuserAdmin允许用户写入system.users集合,并可以在指定的数据库中创建、删除和管理用户。clusterAdmin仅在Admin数据库中可用,为用户提供了与碎片和复制集相关的所有功能的管理权限。ReadAnyDatabase只在admin数据库中可用,readWriteAnyDatabase只在admin数据库中可用,userAdminYDataBase只在admin数据库中可用,userAdminYDataBase只在admin数据库中可用,dbAdminAnyDatabase只在admin数据库中可用。Root仅在管理数据库中可用。超级账号,超级权限通过上表,我们可以得出:根据权限的作用范围上来看,权限分为了两大类权限:针对每一库的权限、针对全部数据库的权限。根据不同的权限分类,在赋值格式上也有一定差异,在具体的用户权限分配上,一个用户可以同时分配多个权限。.
添加用户时,权限初始化格式为:所有数据库权限的初始化命令格式:db.createUser({user: '用户名'pwd: '密码'roles:['权限值']})指定数据库权限的初始化命令格式:db.createUser({user: '用户名'),Pwd: '密码'ROLES3360 [{ROLE 3360 '权限值'db: '对应数据库' },{role: '条件假设:有三个数据库:testdb001和testdb002,用户需要被分配相应的权限用户.
需要分配的权限
具体的命令
adminRoot超级账号,具有所有数据库的全部操作权限useadmindb.createUser({user:"adminRoot",pwd:"123",roles:["root"]})adminWrite超级写账号,具有所有数据库的读写操作权限useadmindb.createUser({user:"adminWrite",pwd:"123",roles:["readWriteAnyDatabase"]})adminRead超级写账号,具有所有数据库的读操作权限useadmindb.createUser({user:"adminRead",pwd:"123",roles:["readAnyDatabase"]})001Write具有数据库testdb001的读写操作权限useadmindb.createUser({user:"001Write",pwd:"123",roles:[{role:"readWrite",db:"testdb001"}]})001Read具有数据库testdb001的读操作权限useadmindb.createUser({user:"001Read",pwd:"123",roles:[{role:"read",db:"testdb001"}]})012Write具有数据库testdb001、testdb002的读写操作权限useadmindb.createUser({user:"001Write",pwd:"123",roles:[{role:"readWrite",db:"testdb001"},{role:"readWrite",db:"testdb002"}]})
通过实际举例,应该对权限的新增初始化操作命令有了理解,那么下面我们就来对权限的根据新操作命令简单聊聊,其实根系和初始化具体的权限格式是一至的,具体如下:
针对全部数据库权限更新命令格式:db.updateUser("被更新用户名",{pwd:"更新后的密码",roles:["权限值"]})针对指定数据库权限更新命令格式:db.updateUser("被更新用户名",{pwd:"更新后的密码",roles:[{role:"权限值",db:"对应的数据库"},{role:"权限值",db:"对应的数据库"}….]})注意:updateUser的第二个参数有两个节点:pwd和roles。如果不需要更新某一节点的数据,那么直接不要该节点即可。实例:继续上面的实例继续操作
用户更新述求
具体的命令
更新用户adminRoot的密码为111111useadmindb.updateUser("adminRoot",{pwd:"111111"})更新001Write的同时具有testdb001和testdb002的写权限useadmindb.updateUser("adminWrite",{roles:[{role:"readWrite",db:"testdb001"},{role:"readWrite",db:"testdb002"}]})更新001Read的同时具有testdb001和testdb002的读权限,并且密码也更新为111111useadmindb.updateUser("001Read",{pwd:"111111",roles:[{role:"read",db:"testdb001"},{role:"read",db:"testdb002"}]})
数据库(database)
具体的数据库概念和RDBMS一致,一个mongodb可以创建多个数据库,不同数据库也可以存储在不同的mongodb。系统的默认数据库包括:admin(存储用户权限相关)、config(配置信息)、local(日志信息)。针对数据库我们常用的操作包括:创建、删除。具体的实现如下:
创建:use数据库名称
当数据库名称不存在时,系统自动创建(创建后不能显示,需要向里面插入数据才会显示),存在则切换。
删除:首先要切换到对于的数据库,然后在执行dropDatabase命令
use被删除的数据库名称
db.dropDatabase()
集合(Collection)
集合是mongodb中对数据存储的一个分组,和关系数据库中的表是对应关系。集合中存储的文档数据的无固定格式,可以自由存储不同格式的bjson数据,但是在实际使用中,我们还是存储同一类型的bjson数据。集合的常见的操作命令如下:
创建集合:
db.createCollection(集合名称,集合规则),其中第二次参数为一个json数据,非必填,具体的参数节点为:
集合规则:{capped:选填bool类型:设置改集合是否为一个固定集合,
true:代表固定集合,集合中的数据不可修改,与size配对使用,代表当集合达到指定大小后,会自动覆盖历史数据(最先添加的数据),
size:选填数字类型:指定集合的最大存储数据(字节数),当集合达到指定大小后,会自动覆盖历史数据(最先添加的数据)}
max:选填数字类型:指定集合的最大存储的文档总个数,当文档个数大于max值时,会自动替换历史文档
}
collection删除:
db.集合名称.drop();
文档(Document)
文档就一组键值(key-value)对数据(一个BJON),具体的一个文档结构可以多层嵌套,不同文档间的数据结构可以不一样,并且相同节点的数据类型也可不一样,这是与RDBMS最大的区别所在,这也奠定了MongoDB的高可扩展性。其实简单的说就是一个一个的jon格式的数据。
文档常见的几个操作命令汇总:
操作
命令格式
插入数据db.集合名称.insert(json对象)json可以是单个数据,也可以是一个集合列表更新数据db.集合名称.update(query,update,option)query:被更新文档条件jsonupdate:更新后的文档jsonoption:更新方式json,参数格式为{upsert:boolean,multi:boolean}upsert:非必填参数,如果不存在是否新增,当值为true时,如果没有符合条件的数据,就插入数据,,默认为falsemulti:非必填参数,是否更新符合要求的所有数据,当值为true时,符合条件的数据全部更新,默认为false删除数据db.集合名称.remove(query,justOne)query:(可选)删除的文档的条件。justOne:(可选)如果设为true或1,则只删除一个文档,如果不设置该参数,或使用默认值false,则删除所有匹配条件的文档。查询数据db.集合名称.find(jison对象查询条件)
字段
字段就很好理解了,就是文档中的json数据的每一个节点。
通过对mongodb的操作简单介绍,其实我们不难发现以下一些特性:
1.无论是对文档的增、删、改、查操作的参数一切皆json,在实际操作的时候,按照json方式来操作即可。
2.数据库和集合都可以在使用是自动创建:
2.1use切换数据库时,如果没有数据库自动创建;
2.2db.集合.insert()当集合不存在时,系统自动创建集合。
Mongodb的这一些特性用起来是不是很爽的感觉。下面从数据库的创建,到文档的整体操作流程写一些演示实例,来加深印象。
操作
命令格式连接到mongdbmongouseadmindb.auth("用户名","用户密码")创建数据库bd001和表user001usebd001db.createCollection("user001")创建数据库bd002和user002usebd002db.createCollection("user002")查看所有数据库showdbs输出结果admin0.000GBconfig0.000GBlocal0.000GBbd0010.000GBbd0020.000GB删除集合user002usedb002db.user002.drop()删除数据库db002usedb002db.dropDatabase()向表user001插入一条数据usedb001db.user001.insert({name:”程序员修炼之旅”,age:2})向表user001插入两条数据usedb001db.user001.insert([{name:"mongodb",age:12,type:"database"},{"name":".net",from:"U.S.A"}])向表user001插入三条数据usedb001db.user001.insert([{name:"zhangsan",age:12,sex:"man"},{name:"zhangsan",age:18,sex:"woman"},{name:"zhangsan",age:22,sex:"man"}])查询一下表中的数据情况usedb001db.user001.find()查询结果:{"_id":ObjectId("5fa0ab4195368a0bf20f38cd"),"name":"程序员修炼之旅","age":2}{"_id":ObjectId("5fa0abb495368a0bf20f38d0"),"name":".net","from":"U.S.A"}{"_id":ObjectId("5fa0ad3b95368a0bf20f38d1"),"name":"zhangsan","age":12,"sex":"man"}{"_id":ObjectId("5fa0ad3b95368a0bf20f38d2"),"name":"zhangsan","age":18,"sex":"woman"}{"_id":ObjectId("5fa0ad3b95368a0bf20f38d3"),"name":"zhangsan","age":22,"sex":"man"}查询表中name="程序员"的数据usedb001db.user001.find({name:"程序员"})查询结果:{"_id":ObjectId("5fa0ab4195368a0bf20f38cd"),"name":"程序员","age":2}修改表中name="程序员"的数据的age=66,并新增一个节点from节点usedb001db.user001.update({name:"程序员"},{$set:{age:66,from:"CDU"}})查看修改后的数据usedb001db.user001.find({name:"程序员"})查询结果:{"_id":ObjectId("5fa0ab4195368a0bf20f38cd"),"name":"程序员","age":66,from:"CDU"}数据已经是修改后的数据了修改表中name="zhangsan"的数据的age=88,并且只修改一条符合要求的数据usedb001db.user001.update({name:"zhangsan"},{$set:{age:88}},{multi:false})查看name="zhangsan"修改后的数据,是否只有一条数据的age被修改为88?usedb001db.user001.find({name:"zhangsan"})查询结果:{"_id":ObjectId("5fa0ad3b95368a0bf20f38d1"),"name":"zhangsan","age":88,"sex":"man"}{"_id":ObjectId("5fa0ad3b95368a0bf20f38d2"),"name":"zhangsan","age":18,"sex":"woman"}{"_id":ObjectId("5fa0ad3b95368a0bf20f38d3"),"name":"zhangsan","age":22,"sex":"man"}只有第一条的age被修改为了88修改表中name="zhangsan"的数据的age=99,修改符合要求的所有数据usedb001db.user001.update({name:"zhangsan"},{$set:{age:99}},{multi:true})查看name="zhangsan"修改后的数据,是否只所有数据的age被修改为99?usedb001db.user001.find({name:"zhangsan"})查询结果:{"_id":ObjectId("5fa0ad3b95368a0bf20f38d1"),"name":"zhangsan","age":99,"sex":"man"}{"_id":ObjectId("5fa0ad3b95368a0bf20f38d2"),"name":"zhangsan","age":99,"sex":"woman"}{"_id":ObjectId("5fa0ad3b95368a0bf20f38d3"),"name":"zhangsan","age":99,"sex":"man"}name="zhangsan"的所有数据age被修改为了99修改name="lisi"的age=77usedb001db.user001.update({name:"lisi"},{$set:{age:77}})查看数据修改结果由于没有name=lisi的数据,所有查询不到数据usedb001db.user001.find({name:"lisi"})查询结果:无数据修改name="lisi"的age=77,如果没有则新增usedb001db.user001.update({name:"lisi"},{$set:{age:77}},{upsert:true})查看数据修改结果新增了一条name="lisi"的数据usedb001db.user001.find({name:"lisi"})查询结果:{"_id":ObjectId("5fa0b3731b875939723ffe26"),"name":"lisi","age":77}删除一条name="zhangsan"的数据usedb001db.user001.rmove({name:"zhangsan"},1)查看删除结果usedb001db.user001.find({name:"zhangsan"})查询结果:{"_id":ObjectId("5fa0ad3b95368a0bf20f38d2"),"name":"zhangsan","age":18,"sex":"woman"}{"_id":ObjectId("5fa0ad3b95368a0bf20f38d3"),"name":"zhangsan","age":22,"sex":"man"}name="zhangsan"的数据数据由原来的3条变为了2条,被删除了一条删除所有name="zhangsan"的数据usedb001db.user001.rmove({name:"zhangsan"})查看删除结果usedb001db.user001.find({name:"zhangsan"})查询结果:无数据name="zhangsan"的数据数据被全部删除了
通过上面的实际操作,我们发现所有新增文档都会自动生成一个节点”_id”(ObjectId),该_id是mongodb系统自动生成的类似唯一主键,可以很快的去生成和排序,包含12bytes,含义是:
1.前4个字节表示创建unix时间戳,格林尼治时间UTC时间,比北京时间晚了8个小时
2.接下来的3个字节是机器标识码
3.紧接的两个字节由进程id组成PID
4.最后三个字节是随机数
当然_id也可以根据实际需要自定义赋值。
摘取自:https://www.cnblogs.com/xiaoXuZhi/p/xyh_mongodb_base.html