我叫MongoDb,不懂个人看完个人故事您就入门啦!

我叫MongoDb,不懂个人看完个人故事您就入门啦!

这是mongo基础篇,后续会连续更新4篇程序员

你们好我叫MongoDb,自从07年10月10gen团队把我带到这个世界来,我已经13岁多啦,如今愈来愈多的小伙伴在拥抱我,我很高兴。我是NoSQL你们族的一员,我是C++的亲儿子啦。为了你们更好的熟悉我,今天我先简单从简单的使用角度来介绍我本身。mongodb

首先仍是先介绍一下咱们的你们族NoSQL吧数据库

NoSQL只是他简称,他的中文名叫 非关系型数据库,外文名叫Not Only SQL。他是对关系型数据库的一个补充(RDBMS)。RDBMS追求数据存储和查询的高度结构化、严格的数据一致性;NOSQL不在意形式,重点关心效率,NOSQL是高性能、无模式、高可扩展的分布式数据库,NOSQL存储包括四种类型:键值对存储、列存储、文档存储、图形数据存储。NoSQL就简单介绍到这,这不是今天的重点,下面仍是重点介绍一下我本身(MongoDb),呵呵!json

MongoDb自我介绍数据结构

MongoDb是一个面向文档存储的键值对NOSQL数据库,是一个最接近关系型数据库的非关系数据库。在数据存储结构和查询上使用BJOSN(相似于JSON)结构,BJOSN支持多层机构,在具体的使用过程当中,更像是操做Javascript脚本。正由于MongoDb的无模式化,在实际应用中变得更加灵活,易于扩展。与RDBMS同样,支持主键、索引、检索等操做,因为非结构化因此不支持join查询。app

MongoDb的基本概念分布式

具体的数据库安装就不在介绍了,网上一搜一大推。MongoDb采用BJON化的文档存储,因此其基本结构概念能够结合JSON联想一下:字段、文档、集合、数据库,这和RDBMS的属性、列、表、数据库是一一对应关系。下面以一个表格来对比说明一下:函数

 

RDBMS性能

MongoDbspa

概念

说明

概念

说明

database

数据库

database

数据库

table

collection

集合

row

document

文档:对应的一个BJSON

column

field

字段:BJSON中的具体某一个字段

 

简单的一个表格显示还不够直观,那咱们在来一张形象的图片来讲明一下吧!

用户权限管理

在生成环境数据库管理中,数据库权限是一个很重要的功能。在具体的权限上,须要针对全局的权限控制,须要精确到具体的数据的权限,在具体的权限分类上包括:读、读写、管理员等权限。下面列表介绍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:"用户名",pwd:"密码",roles:["权限值"]})

针对指定数据库权限初始化命令格式:

db.createUser({user:"用户名",pwd:"密码",roles:[ {role:"权限值",db:"对应的数据库"},{role:"权限值",db:"对应的数据库"}….]})

这样说可能不怎么好理解,那么咱们仍是以实际工做的使用状况来举例说明。

条件假设:有3个数据库:testdb00一、testdb002

须要给如用户分配对应的权限

用户

须要分配的权限

具体的命令

adminRoot

超级帐号,具备全部数据库的所有操做权限

use admin

db.createUser({user:"adminRoot",pwd:"123",roles:["root"]})

adminWrite

超级写帐号,具备全部数据库的读写操做权限

use admin

db.createUser({user:"adminWrite",pwd:"123",roles:["readWriteAnyDatabase"]})

adminRead

超级写帐号,具备全部数据库的读操做权限

use admin

db.createUser({user:"adminRead",pwd:"123",roles:["readAnyDatabase"]})

001Write

具备数据库testdb001的读写操做权限

use admin

db.createUser({user:"001Write",pwd:"123",roles:[ {role:"readWrite",db:" testdb001"}]})

001Read

具备数据库testdb001的读操做权限

use admin

db.createUser({user:"001Read",pwd:"123",roles:[ {role:"read",db:" testdb001"}]})

012Write

具备数据库testdb00一、testdb002的读写操做权限

use admin

db.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的密码为111111

use admin

db.updateUser("adminRoot",{pwd:"111111"})

更新001Write的同时具备testdb001和testdb002的写权限

use admin

db.updateUser("adminWrite",{roles:[ {role:"readWrite",db:" testdb001"},{role:"readWrite",db:" testdb002"}]})

更新001Read的同时具备testdb001和testdb002的读权限,而且密码也更新为111111

use admin

db.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 :被更新文档条件json

update:更新后的文档json

option:更新方式json,参数格式为{ upsert: boolean, multi : boolean }

upsert:非必填参数,若是不存在是否新增,当值为true时,若是没有符合条件的数据,就插入数据, ,默认为false

multi: 非必填参数,是否更新符合要求的全部数据,当值为true时,符合条件的数据所有更新,默认为false

删除数据

db.集合名称.remove(query , justOne )

query :(可选)删除的文档的条件。

justOne : (可选)若是设为 true 或 1,则只删除一个文档,若是不设置该参数,或使用默认值 false,则删除全部匹配条件的文档。

查询数据

db.集合名称.find(jison对象查询条件)

 

字段

字段就很好理解了,就是文档中的json数据的每个节点。

经过对mongodb的操做简单介绍,其实咱们不难发现如下一些特性:

1.不管是对文档的增、删、改、查操做的参数一切皆json,在实际操做的时候,按照json方式来操做便可。

2.数据库和集合均可以在使用是自动建立:

2.1 use 切换数据库时,若是没有数据库自动建立;

2.2 db.集合.insert() 当集合不存在时,系统自动建立集合。

Mongodb的这一些特性用起来是否是很爽的感受。下面从数据库的建立,到文档的总体操做流程写一些演示实例,来加深印象。

操做

命令格式

链接到mongdb

mongo

use admin

db.auth("用户名","用户密码")

建立数据库 bd001和表user001

use bd001

db.createCollection("user001")

建立数据库 bd002和user002

use bd002

db.createCollection("user002")

查看全部数据库

show dbs

输出结果

admin   0.000GB

config  0.000GB

local   0.000GB

bd001  0.000GB

bd002  0.000GB

删除集合user002

use db002

db.user002.drop()

删除数据库db002

use db002

db. dropDatabase()

向表user001插入一条数据

use db001

db.user001.insert({name:”程序员修炼之旅”,age:2})

向表user001插入两条数据

use db001

db.user001.insert([

{name:"mongodb",age:12,type:"database"},

{"name":".net",from:"U.S.A"}

])

向表user001插入三条数据

use db001

db.user001.insert([

{name:"zhangsan",age:12,sex:"man"},

{name:"zhangsan",age:18,sex:"woman"},

{name:"zhangsan",age:22,sex:"man"}

])

查询一下表中的数据状况

use db001

db.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="程序员修炼之旅"的数据

use db001

db.user001.find({name: "程序员修炼之旅"})

查询结果:

{ "_id" : ObjectId("5fa0ab4195368a0bf20f38cd"), "name" : "程序员修炼之旅", "age" : 2 }

修改表中name="程序员修炼之旅"的数据的age=66,并新增一个节点from节点

use db001

db.user001.update({name: "程序员修炼之旅"},{$set:{age:66,from: "CDU"}})

查看修改后的数据

use db001

db.user001.find({name: "程序员修炼之旅"})

查询结果:

{ "_id" : ObjectId("5fa0ab4195368a0bf20f38cd"), "name" : "程序员修炼之旅", "age" : 66,from: "CDU"}

数据已是修改后的数据了

修改表中name=" zhangsan"的数据的age=88,而且只修改一条符合要求的数据

use db001

db.user001.update({name: "zhangsan"},{$set:{age:88}},{ multi:false})

查看name=" zhangsan"修改后的数据,是否只有一条数据的age被修改成88?

use db001

db.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,修改符合要求的全部数据

use db001

db.user001.update({name: "zhangsan"},{$set:{age:99}},{ multi:true})

查看name=" zhangsan"修改后的数据,是否只全部数据的age被修改成99?

use db001

db.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=77

use db001

db.user001.update({name: "lisi"},{$set:{age:77}})

查看数据修改结果

因为没有name=lisi的数据,全部查询不到数据

use db001

db.user001.find({name: "lisi"})

查询结果:

无数据

修改name="lisi"的age=77,若是没有则新增

use db001

db.user001.update({name: "lisi"},{$set:{age:77}},{ upsert:true})

查看数据修改结果

新增了一条name="lisi"的数据

use db001

db.user001.find({name: "lisi"})

查询结果:

{ "_id" : ObjectId("5fa0b3731b875939723ffe26"), "name" : "lisi", "age" : 77 }

删除一条name="zhangsan"的数据

use db001

db.user001.rmove({name: "zhangsan"},1)

查看删除结果

use db001

db.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"的数据

use db001

db.user001.rmove({name: "zhangsan"})

查看删除结果

use db001

db.user001.find({name:"zhangsan"})

查询结果:

无数据

name="zhangsan"的数据数据被所有删除了

经过上面的实际操做,咱们发现全部新增文档都会自动生成一个节点”_id” ObjectId),该_idmongodb系统自动生成的相似惟一主键,能够很快的去生成和排序,包含 12 bytes,含义是:

1.前 4 个字节表示建立 unix 时间戳,格林尼治时间 UTC 时间,比北京时间晚了 8 个小时

2.接下来的 3 个字节是机器标识码

3.紧接的两个字节由进程 id 组成 PID

4.最后三个字节是随机数

https://www.runoob.com/wp-content/uploads/2013/10/2875754375-5a19268f0fd9b_articlex.jpeg

固然_id也能够根据实际须要自定义赋值。

好了今天就先写到这,经过本篇文章对mongo有了一个初步的认识了解,下一篇文章,咱们在一块儿详聊查询,mongo的查询仍是有不少聊的。谢谢您的查看。

END
原创不易,感谢扫描支持,获取更多精彩,谢谢:

相关文章
相关标签/搜索