mongodb讲解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mongodb讲解相关的知识,希望对你有一定的参考价值。

mongodb

1标题1错误!未定义书签。

1.1标题2错误!未定义书签。

1.1.1标题3错误!未定义书签。

 


概述

mongodb:是介于关系型与非关系之间的一种数据库系统!

1.1 概述,mongodb是文档型非关系数据库

是一种数据库,类似mysql

不同于MySQL的是:是一种非关系型数据库

非关系型数据库:NOSQL-(Not Only SQL, non-relation)。不以关系型(二维表)进行数据存储结构的数据库的统称。包括:memcached(内存型数据库),文件系统,redisMongodb

发展到今天:典型的非关系有:

key-value型。

文档型(document)(mongodb的存储结构类型)

图型(大数据)

 

1.2 文档型存储系统

类似于,关系型(二维表)。

 

二维表中的记录 映射成 文档型的文档。

区别是:文章  文章分类

二维表:


article

Article_id



Article_content



Category_id

所属分类ID

关联字段

category

Category_id



Category_title



 

 

文档型:

将当前内容相关的全部的数据,存储为一个文档。

站在文章的角度去存储。会得到下面的文档:

内容:北京php训练营,开营了!

分类:PHP培训

 

理解成:没有满足范式设计的数据表

 

优势:存储,提取。不需要做大量的关联操作,就可以获相关的全部属性。

劣势:更新,维护。出现大量的数据冗余。

 

可见:

项目中:

日志,文章管理部分,存储到mongodb。会得到较高的存取速度。

复杂,核心数据的维护,存储关系型数据。

 

 

安装

2.1 linux

2.2 windows

下载:获取最新的mongodb

https://www.mongodb.com/download-center

3.2.x 目前最新的版本。

技术分享 

 

运行程序安装即可

技术分享 

配置安装路径

技术分享 

成功结果:

技术分享 

 

管理mongodb

3.1 C/S架构

3.2 服务器端:mongod

3.2.1 linux

3.2.2 windows

daemon

bin/mongod

技术分享 

 

3.2.2.1 CMD

bin/mongod help

技术分享 

 

配置:数据目录。(必要)

配置:日志文件。(可选,强烈建议)

技术分享 

通过运行日志可知:默认端口是27017

log/mongod.log

技术分享 

选项  --port 自定义端口,来设置新的监听端口

技术分享 

 

 

如果是32bit的同学:

启动时,增加选项: --storageEngine=”MMAPv1” 表示选择mmapv1 存储引擎的意思。

 

3.2.2.2 服务形式管理

安装成windows的服务。

mongod --install

mongod --remove

mongod --reinstall

 

安装:

技术分享 

技术分享 

 

3.3 客户端:mongo

技术分享

技术分享 

 

--host, --port 指定连接目标服务器地址

技术分享 

 

操作mongodb的核心概念

4.1 文档型数据库系统

参考:1.2章节

存储结构

4.2 文档-集合-数据库,三级层级组成结构

1. 数据库,database

2. 集合,collection

3. 文档,document

文档存储与集合中,集合存储与数据库中。

对比关系型数据库系统:

记录存储与中,表存储与数据库中。

技术分享

4.3 文档是独立

同一个集合中的文档的结构,是可以不相同的。而没有逻辑关系的。是独立的。

例如,同一个集合 Student中的文档:

技术分享 

 

理解:

文档就是定义在不同的命名空间的数据变量。

文档:变量。(复杂的对象类型)

命名空间:由 数据库名.集合名 构成的。

 

4.4 BSONJSON

BSON Binary JSON,可执行的JSON

mongo的客户端语法,基于JSON的可执行版本。

体现:

文档:就是JSON格式。

mongo客户端程序:JSONBSON)的解释器(类似于浏览器解释javascript)。

 

例如:执行一段循环:可以循环插入11条记录。

技术分享 

 

JS全栈:

浏览器端:

移动端:

移动端浏览器

移动端APP

native原生。

Web APPH5+CSS3+JS)。网页被套壳。

Hybrid APP:混合APP

情况一(实现混合):复杂功能由原生实现,展示功能由Web APP实现。

情况二(开发混合):使用html+CSS+JS开发,转换为 原生程序。(react native for iso


服务器端

web服务器:nodeJS

数据库服务器:mongodb

业务逻辑语言:javaScript

 

 

语言  运行环境(运行虚拟机)

 

 

数据库操作

5.1 show dbs

查看所有库

技术分享 

5.2 db

当前库对象

技术分享 

5.3 选择默认库,use db-name

选择默认库

技术分享 

 

如果不在库中增加集合或文档,则库还会消失。

如果创建了集合文档,库就会被自动创建。

5.4 删除库,db.dropDatabase()

删除当前的库。

技术分享 

5.5 查看库状态,db.stats()

5.6 获取库级别帮助,db.help()

集合操作

6.1 查看所有集合,show collections

当前库下的集合列表

技术分享 

6.2 创建集合,db.createCollection(‘collection-name‘)

库创建集合,

当前库对象.createCollection(‘集合名)

技术分享 

 

6.3 删除集合,db.collection-name.drop()

一但创建了集合,在当前数据库对象上,增加一个集合名属性。引用该的集合。

通过该集合对象的方法,就可以操作集合。

删除集合

技术分享 

6.4 改名集合,db.collection-name.renameCollection(‘new-collection-name‘)

改名

技术分享 

6.5 获取集合帮助,db.collection-name.help()

6.6 获取集合状态,db.collection-name.stats()

 

文档操作

7.1 CRUD

7.1.1 增,db.collection-name.insert()

db.collection-name.insert(json对象)

每次插入一个文档对象。

技术分享 

 

7.1.2 db.collection-name.find()

db.collection-name.find([条件对象, 属性过滤对象])

技术分享 

7.1.3 db.collection-name.update()

db.collection-name.update(条件,更新内容)

当前数据

技术分享 

修改:

技术分享 

结果:

默认修改一条

技术分享 

 

可以通过 第四个参数进行修改:

 

7.1.4 删,db.collection-name.remove()

db.collection-name.remove({条件})

技术分享 

 

 

 

7.2 ObjectID

文档的内部标识。mongodb内部使用的。非业务逻辑数据。

技术分享 

 

了解:

生成原则:时间,机器名要素生成。

578ca7cc250c87e1c9acd1e2

时间戳(秒)

主机标识

进程标识

顺序号

 

 

7.3 基本语法

大小写敏感。

类型敏感:6 ‘6’ 是不同的数据,强类型

有序键值对:json键值对。{name: ‘kang’, age: 30}  {age:30, name:’kang’}不是同一个数据。

面向对象编程。

JavaScript语法保持一致

 

7.4 条件的处理

7.4.1 概述

查询.find(query),删除.remove(query),修改.update(query)

query,就是查询条件。

通用的语法:

json对象。

每个属性表示一个条件。(或其他运算)

通用的格式:

{属性: {关系运算符: 比较值’}}

tip:参考 框架中 关于查询条件的数组写法:[‘age’=>[‘gt’, 50]]

 

7.4.2 关系运算符

7.4.2.1 $lt, 小于

7.4.2.2 $lte,小于等于

7.4.2.3 $gt,大于

7.4.2.4 $gte,大于等于

7.4.2.5 $ne,不等于

例如:年龄大于50的学生

技术分享 

7.4.2.6 $in,在某个集合中

{‘$in‘: [93, 96]}

7.4.2.7 $nin,不在某个集合中

{‘$nin‘: [93, 96]}

 

例如:年龄 966626 的人:

技术分享 

不在集合:

技术分享 

7.4.2.8 $mod,计算余数比较

{‘$mod‘: [3, 1]},找到对3取余,余数为1的数据。

接受 数组型参数,第一个元素表示对几取余。第二个元素,表示余数为几。

技术分享 

7.4.2.9 $exists,是否存在某个属性

{$exists:false},某个属性是否存在。

技术分享 

 

检索,没有age属性的文档:

db.phpStudent.find({age: {$exists: false}}, {_id: false});

技术分享 

没检索到 agenull的文档。

 

null的比较:

如果属性为null,算存在!$exists:true, 不能匹配 属性为null的文档

检索 属性值为null:不存在属性的文档也被检索到。

技术分享 

 

如果需要检测 存在,但是为null的属性文档呢?

$exists: true, $eq:null

 

7.4.3 逻辑运算符

7.4.3.1 $and

{$and: [条件1, 条件2]},通用:

 

技术分享 

 

如果两个条件,是针对于同一个属性(字段),可以将$and的关系间写成:

技术分享 

 

如果多个属性存在条件,条件间是 $and关系,可以间写成:

技术分享 

7.4.3.2 $or

{$or: [条件1, 条件2..]}

支持的通用语法:

技术分享 

技术分享 

没有相应的简写语法!

7.4.3.3 $not

获取年不为null的数据:

技术分享 

 

7.4.4 正则检测

{属性: 正则表达式对象}

//

例如:name以风开头:

技术分享 

技术分享 

 

7.4.5 数组元素检测

7.4.5.1 完全匹配 :[]

与给定的数组保持绝对一致:元素和顺序

测试数据:

技术分享 

检索

技术分享 

技术分享 

比较是有序的!

7.4.5.2 包含匹配 : value

技术分享 

技术分享 

 

7.4.5.3 包含全部 $all

{$all:[元素列表]}

技术分享 

 

可以使用 and关系,改写:(不推荐,如果元素过多,语法会复杂)

技术分享 

 

结果一致

技术分享 

 

7.4.5.4 数组索引对应匹配, property.index

属性.index’, 表示该索引值的元素

技术分享 

技术分享 

 

7.4.6 对象的比较。(内联文档)

技术分享 

嵌入json对象内部的json对象,称之为内联文档!

 

测试数据:

技术分享 

7.4.6.1 完全匹配 : {}

严格与给定的对象保持一致。顺序和键值对!

技术分享 

技术分享 

7.4.6.2 对应的属性匹配 ‘propertyObject.property’:’value’

 

查找:php成绩为66 的:

技术分享 

技术分享 

 

7.4.7 $where,自定义条件 $where: function() {return true|false}

例如:PHP成绩 高于  mongodb 成绩的同学,错误的方法:

技术分享 

 

由于是 非关系,结构,不能做,属性间的横向比较!

 

使用自定义条件完成:

技术分享 

技术分享 

 

7.5 查询操作 find()

find(query, property)

7.5.1 查询条件

参考:7.4

7.5.2 属性过滤

默认是全部属性。

技术分享 

如果独立某个属性为true,则其他属性不予展示。

_id例外。

技术分享 

技术分享 

 

 

7.5.3 分组-统计,group()

group({

key: 分组属性,

condition: 分组前的过滤,

initial: 组内初始化数组,

$reduce: 文档回调

finalize: 组内结尾回调

})

逻辑如下:

依据 key 给定的属性进行分组。如果给了condition,使用对应的条件筛选掉不满足的文档。

 

initial: 每组对应的数据对象初始值。

$reduce: 函数,针对于每个文档都会调用。用该函数完成对组内数据的统计处理。

自定义的组内统计函数。

finalize: 每组结束时,自动调用的回调函数

 

测试:例如:按照班级统计学生信息

统计学科 考试的平均成绩:获取总成绩,知道班级内的人数。

技术分享 

执行次数如图所示:

技术分享

 

 

7.5.4 排序结果,find().sort();

{排序属性: 1, 排序属性:-1}

1, 升序

-1,降序

如果存在多个排序属性,先依据属性1排,再依据属性2排。

例如:

技术分享 

技术分享 

 

7.5.5 截取文档find().skip() find().limit()

find().skip(Number),跳过NuMber条记录

find().limit(Number),表示仅仅获取前Number条记录

 

例如:

 

技术分享 

 

7.5.6 统计文档数collection.count()

count({条件})

条件可选,表示全部。

技术分享 

技术分享 

 

7.5.7 去重统计collection.distinct()

不是针对文档,而是针对于属性。

collection.distinct(属性名)

技术分享 

 

7.5.8 游标,cursor

db.collection.find() 方法返回的是游标。

var cursor = db.collection.find();

游标:

查询得到的文档结果集的引用。

 

当执行find(),数据还没有被客户端所获取。而是将被查询的文档,使用游标所引用。

当执行find()而不去赋值时,mongo客户端,会自动的执行从游标获取数据。

技术分享 

相对:

技术分享 

相当于,去班级找10名会书法的同学,没有将10名同学叫过来,而仅仅记录其名字

仅仅得到了一份名单。

 

方法:sort(), limit(),skip(), 都是游标对象上的方法。操作的是游标,(是名单而已)

 

7.5.8.1 hasNext();

是否存在下一个。

7.5.8.2 next();

获取游标中的下一个数据。

配合 循环结构,获取游标中的全部文档。

技术分享 

 

7.5.8.3 cursor.forEach();建议推荐

迭代游标。

技术分享 

 

内部的优化措施:会一次性通过游标获取一定量的数据(不仅仅是一个文档),下次获取时,速度被优化。

 

7.6 更新

7.6.1 常规更新

db.collection-name.update(query, bson)

技术分享 

常规的模式,使用新文档,替换 旧文档,而不是进行 属性的更新set工作。

执行:

技术分享 

结果:

技术分享 

如果条件匹配多条,仅仅可以更新一条

要求:使用具有标志性的条件,作为更新条件。

 

7.6.2 upsert更新插入

update - insert

如果条件匹配失败,则选择执行 插入操作。

 

默认的是没有该行为的,可以通过传递update方法的第三个参数,进行设置。true表示,执行upsert操作!

技术分享 

 

7.6.3 属性更新,修改器

类似于 关系型,是否可以仅仅更新 文档的某个属性呢?使用修改器可以做到更新属性。

 

特殊的标识运算符:

7.6.3.1 $set,设置某个字段的值

{$set: {title: ‘new-title‘}}

存在则修改,不存在则添加。

技术分享 

技术分享 

7.6.3.2 $unset,删除某个字段

{$unset: {class:true}}

技术分享 

技术分享 

技术分享 

7.6.3.3 $inc,递增/递减

{$inc:{php:10}}递增

{$inc:{php:-10}}递减

技术分享 

技术分享 

7.6.3.4 $push,数组入栈

{$push:{hobby:‘new-hobby‘}}

技术分享 

7.6.3.5 $pushAll,数组入栈多个元素

{$push:{hobby:[‘new-hobby-1‘, ‘new-hobby-2‘]}}

技术分享 

 

注意,无论push 还是 pushAll,是不会检测 数据元素的唯一性的。

7.6.3.6 $addToSet,加入到数组

{$addToSet:{hobby:‘new-hobby‘}}

push类似,加入集合前,会检测集合中的元素是否存在,如果存在不会重复添加。

技术分享 

7.6.3.7 $pull,从数组中拉出数据

{$pull: {属性: ‘’}}

匹配到数组元素,将其从数组中删除

技术分享 

7.6.3.8 $pullAll,从数组中拉出多个数据

技术分享 

技术分享 

7.6.3.9 $pop,数组出栈

将数组中最后一个元素 出栈!

技术分享 

 

 

7.6.4 更新多条

技术分享

需要使用第四个参数进行强行设置:

技术分享 

 

更新多条,目前要求配合修改器一起使用!

技术分享 

 

 

索引

加速排序,加速检索的 重要的功能!

在某个属性上加索引。

8.1 索引类型

8.1.1 普通索引,对关键字没有要求

8.1.2 唯一索引,要求关键字唯一

8.1.3 2d平面空间索引,要求关键字是,坐标。x,y

8.2 管理索引

8.2.1 添加索引

db.collection-name.ensureIndex(属性集合,属性选项)

技术分享 

测试:

phpStudent上增加索引:

技术分享 

8.2.2 查看索引

db.collection-name.getIndexes();

技术分享 

 

8.2.3 删除索引

db.collectoin-name.dropIndex(‘index-name’);

技术分享 

 

db.collection-name.dropIndexes()

删除集合上的全部索引。

只有在:初始化大量的集合数据时,才可能删除全部索引的。

 

 

8.2.4 选项:指定索引名字

name选项:

技术分享 

 

8.2.5 选项:唯一索引

uniquetrue

技术分享 

技术分享 

 

要求:已经存在文档,文档的属性不能重复。

如果出现重复,选择选项:

dropDups:true,自动删除掉重复的文档!

 

8.3 平面空间2d索引

要求在 具有2个元素的属性上,创建2d索引:

例如:

技术分享 

对应:

技术分享 

 

将每个人的坐标,存储到mongo中。快速的检索:

1:谁离我近。距离检索。

2:范围内,谁在。范围检索。

 

实现:

增加文档数据:

创建gis属性上的,空间二维索引

技术分享 

利用索引检索:

距离检索:{gis: {$near:[x,y]}}

距离降维(00)最近的人儿

技术分享 

范围检索:$within不同的形状,使用不同语法

圆形:$center

技术分享 

技术分享 

 

矩形范围:$box

技术分享 

 

 

功能概要

9.1 复制,replicate

master slave

9.2 分区(分片)

9.3 map/reduce

大数据的特征。

 

大数据:

存储。分布式文件系统。(分片)

分析。map/reduce

 

 

10 PHP操作mongodb

PHP作为mongodb的客户端

10.1 加载操作mongodb的扩展

mongomongodb

 

下载mongo.dll

技术分享 

解压:

技术分享 

拷贝到PHP的扩展目录中

技术分享 

 

修改 php.ini

技术分享 

 

apache restart

 

测试

技术分享 

 

 

10.2 基本语法

面向对象语法。

提供的类:

MongoClient,连接服务器

MongoDB,操作数据库

MongoCollection,操作集合(常用)

MongoCursor,游标,处理数据

 

操作是无状态的。

 

典型的过程:

连接,

通过连接得到库,通过库操作集合,通过集合操作文档!

如果是获取查询文档,需要通过游标完成操作。

 

连接

技术分享 

 

操作,库,集合,文档

技术分享 

 

 

语法与mongo客户端语法,完全一致。

对应的转换:

JS数组:PHP索引数组

JS对象JSONPHP关联数组

JS回调函数:PHP字符串(符合JS语法格式)

10.3 获取集合中的全部数据

技术分享 

 

10.4 增加条件获取

技术分享 

 

10.5 过滤字段

技术分享 

 

10.6 排序查询sort

sort(),游标的方法

技术分享 

10.7 skip()limit()

游标的方法

技术分享 

10.8 分组查询,group()

技术分享 

10.9 

技术分享 

10.10 删除

技术分享 

10.11 修改

技术分享 

 

 

11 mongodb的使用

11.1 哪里用?为什么用?

文档管理类。

 

11.2 不能用在哪里?

不处理关联,不处理频繁的更新。

 

11.3 数据结构的设计

article

category

tag

 

user

 

 

如果用mongodb管理:

article的集合,分类和tag,都是article的内联文档。

user 的集合


本文出自 “json在php中的使用” 博客,请务必保留此出处http://zhaozhangxiao.blog.51cto.com/10609825/1871095

以上是关于mongodb讲解的主要内容,如果未能解决你的问题,请参考以下文章

mongodb讲解

mongodb讲解

Node.js | MongoDB 入门讲解 & Mongoose 模块的初步应用

Springboot整合MongoDB的Docker开发,其它应用也类似

关于Linux MongoDB的安装

nodejs使用mongodb做数据持久化