标签:关系数据库 category 数据库系统 document article
mongodb
mongodb:是介于关系型与非关系之间的一种数据库系统!
是一种数据库,类似MySQL。
不同于MySQL的是:是一种“非关系型数据库”。
非关系型数据库:NOSQL-(Not Only SQL, non-relation)。不以关系型(二维表)进行数据存储结构的数据库的统称。包括:memcached(内存型数据库),文件系统,redis。Mongodb。
发展到今天:典型的非关系有:
l key-value型。
l 文档型(document)(mongodb的存储结构类型)
l 图型(大数据)
类似于,关系型(二维表)。
二维表中的记录 映射成 文档型的文档。
区别是:文章 和 文章分类
二维表:
article表
Article_id | ||
Article_content | ||
Category_id | 所属分类ID | 关联字段 |
category表
Category_id | ||
Category_title |
文档型:
将当前内容相关的全部的数据,存储为一个文档。
站在文章的角度去存储。会得到下面的文档:
内容:北京PHP训练营,开营了!
分类:PHP培训
”理解成:没有满足范式设计的数据表“。
优势:存储,提取。不需要做大量的关联操作,就可以获相关的全部属性。
劣势:更新,维护。出现大量的数据冗余。
可见:
项目中:
日志,文章管理部分,存储到mongodb。会得到较高的存取速度。
复杂,核心数据的维护,存储关系型数据。
下载:获取最新的mongodb
https://www.mongodb.com/download-center
3.2.x 目前最新的版本。
运行程序安装即可
配置安装路径
成功结果:
daemon
bin/mongod
bin/mongod –help
配置:数据目录。(必要)
配置:日志文件。(可选,强烈建议)
通过运行日志可知:默认端口是27017
log/mongod.log
选项 --port 自定义端口,来设置新的监听端口
如果是32bit的同学:
启动时,增加选项: --storageEngine=”MMAPv1” 表示选择mmapv1 存储引擎的意思。
安装成windows的服务。
mongod --install
mongod --remove
mongod --reinstall
安装:
--host, --port 指定连接目标服务器地址
参考:1.2章节
存储结构
1. 数据库,database
2. 集合,collection
3. 文档,document
文档存储与集合中,集合存储与数据库中。
对比关系型数据库系统:
记录存储与表中,表存储与数据库中。
同一个集合中的文档的结构,是可以不相同的。而没有逻辑关系的。是独立的。
例如,同一个集合 Student中的文档:
理解:
文档就是定义在不同的命名空间的数据变量。
文档:变量。(复杂的对象类型)
命名空间:由 数据库名.集合名 构成的。
BSON: Binary JSON,可执行的JSON。
mongo的客户端语法,基于JSON的可执行版本。
体现:
文档:就是JSON格式。
mongo客户端程序:JSON(BSON)的解释器(类似于浏览器解释JavaScript)。
例如:执行一段循环:可以循环插入11条记录。
JS全栈:
浏览器端:
移动端:
移动端浏览器
移动端APP:
native原生。
Web APP(H5+CSS3+JS)。网页被套壳。
Hybrid APP:混合APP
情况一(实现混合):复杂功能由原生实现,展示功能由Web APP实现。
情况二(开发混合):使用Html+CSS+JS开发,转换为 原生程序。(react native for iso)
服务器端
web服务器:nodeJS
数据库服务器:mongodb
业务逻辑语言:javaScript
语言 和 运行环境(运行虚拟机)
查看所有库
当前库对象
选择默认库
如果不在库中增加集合或文档,则库还会消失。
如果创建了集合文档,库就会被自动创建。
删除当前的库。
当前库下的集合列表
库创建集合,
当前库对象.createCollection(‘集合名‘)
一但创建了集合,在当前数据库对象上,增加一个集合名属性。引用该的集合。
通过该集合对象的方法,就可以操作集合。
删除集合
改名
db.collection-name.insert(json对象)
每次插入一个文档对象。
db.collection-name.find([条件对象, 属性过滤对象])
db.collection-name.update(条件,更新内容)
当前数据
修改:
结果:
默认修改一条
可以通过 第四个参数进行修改:
db.collection-name.remove({条件})
文档的内部标识。mongodb内部使用的。非业务逻辑数据。
了解:
生成原则:时间,机器名要素生成。
578ca7cc250c87e1c9acd1e2
时间戳(秒)
主机标识
进程标识
顺序号
l 大小写敏感。
l 类型敏感:6 与 ‘6’ 是不同的数据,强类型
l 有序键值对:json键值对。{name: ‘kang’, age: 30} 与 {age:30, name:’kang’}不是同一个数据。
l 面向对象编程。
l 与JavaScript语法保持一致
查询.find(query),删除.remove(query),修改.update(query)。
query,就是查询条件。
通用的语法:
json对象。
每个属性表示一个条件。(或其他运算)
通用的格式:
{属性: {关系运算符: ‘比较值’}}
tip:参考 框架中 关于查询条件的数组写法:[‘age’=>[‘gt’, 50]]
例如:年龄大于50的学生
{‘$in‘: [93, 96]}
{‘$nin‘: [93, 96]}
例如:年龄 为96, 66, 26 的人:
不在集合:
{‘$mod‘: [3, 1]},找到对3取余,余数为1的数据。
接受 数组型参数,第一个元素表示对几取余。第二个元素,表示余数为几。
{$exists:false},某个属性是否存在。
检索,没有age属性的文档:
db.phpStudent.find({age: {$exists: false}}, {_id: false});
没检索到 age为null的文档。
与 null的比较:
如果属性为null,算存在!$exists:true, 不能匹配 属性为null的文档
检索 属性值为null:不存在属性的文档也被检索到。
如果需要检测 存在,但是为null的属性文档呢?
$exists: true, $eq:null
{$and: [条件1, 条件2]},通用:
如果两个条件,是针对于同一个属性(字段),可以将$and的关系间写成:
如果多个属性存在条件,条件间是 $and关系,可以间写成:
{$or: [条件1, 条件2, ..]}
支持的通用语法:
没有相应的简写语法!
获取年不为null的数据:
{属性: 正则表达式对象}
//
例如:name以风开头:
与给定的数组保持绝对一致:元素和顺序
测试数据:
检索
比较是有序的!
{$all:[元素列表]}
可以使用 and关系,改写:(不推荐,如果元素过多,语法会复杂)
结果一致
‘属性.index’, 表示该索引值的元素
嵌入json对象内部的json对象,称之为内联文档!
测试数据:
严格与给定的对象保持一致。顺序和键值对!
查找:php成绩为66 的:
例如:PHP成绩 高于 mongodb 成绩的同学,错误的方法:
由于是 非关系,结构,不能做,属性间的横向比较!
使用自定义条件完成:
find(query, property)
参考:7.4
默认是全部属性。
如果独立某个属性为true,则其他属性不予展示。
_id例外。
group({
key: 分组属性,
condition: 分组前的过滤,
initial: 组内初始化数组,
$reduce: 文档回调
finalize: 组内结尾回调
})
逻辑如下:
依据 key 给定的属性进行分组。如果给了condition,使用对应的条件筛选掉不满足的文档。
initial: 每组对应的数据对象初始值。
$reduce: 函数,针对于每个文档都会调用。用该函数完成对组内数据的统计处理。
自定义的组内统计函数。
finalize: 每组结束时,自动调用的回调函数
测试:例如:按照班级统计学生信息
统计学科 考试的平均成绩:获取总成绩,知道班级内的人数。
执行次数如图所示:
{排序属性: 1, 排序属性:-1}
1, 升序
-1,降序
如果存在多个排序属性,先依据属性1排,再依据属性2排。
例如:
find().skip(Number),跳过NuMber条记录
find().limit(Number),表示仅仅获取前Number条记录
例如:
count({条件})
条件可选,表示全部。
不是针对文档,而是针对于属性。
collection.distinct(属性名)
db.collection.find() 方法返回的是游标。
var cursor = db.collection.find();
游标:
查询得到的文档结果集的引用。
当执行find()后,数据还没有被客户端所获取。而是将被查询的文档,使用游标所引用。
当执行find()而不去赋值时,mongo客户端,会自动的执行从游标获取数据。
相对:
相当于,去班级找10名会书法的同学,没有将10名同学叫过来,而仅仅记录其名字
仅仅得到了一份名单。
方法:sort(), limit(),skip(), 都是游标对象上的方法。操作的是游标,(是名单而已)
是否存在下一个。
获取游标中的下一个数据。
配合 循环结构,获取游标中的全部文档。
迭代游标。
内部的优化措施:会一次性通过游标获取一定量的数据(不仅仅是一个文档),下次获取时,速度被优化。
db.collection-name.update(query, bson)
常规的模式,使用新文档,替换 旧文档,而不是进行 属性的更新set工作。
执行:
结果:
如果条件匹配多条,仅仅可以更新一条。
要求:使用具有标志性的条件,作为更新条件。
update - insert
如果条件匹配失败,则选择执行 插入操作。
默认的是没有该行为的,可以通过传递update方法的第三个参数,进行设置。true表示,执行upsert操作!
类似于 关系型,是否可以仅仅更新 文档的某个属性呢?使用修改器可以做到更新属性。
特殊的标识运算符:
{$set: {title: ‘new-title‘}}
存在则修改,不存在则添加。
{$unset: {class:true}}
{$inc:{php:10}}递增
{$inc:{php:-10}}递减
{$push:{hobby:‘new-hobby‘}}
{$push:{hobby:[‘new-hobby-1‘, ‘new-hobby-2‘]}}
注意,无论push 还是 pushAll,是不会检测 数据元素的唯一性的。
{$addToSet:{hobby:‘new-hobby‘}}
与push类似,加入集合前,会检测集合中的元素是否存在,如果存在不会重复添加。
{$pull: {属性: ‘值’}}
匹配到数组元素,将其从数组中删除
将数组中最后一个元素 出栈!
需要使用第四个参数进行强行设置:
更新多条,目前要求配合修改器一起使用!
加速排序,加速检索的 重要的功能!
在某个属性上加索引。
db.collection-name.ensureIndex(属性集合,属性选项)
测试:
phpStudent上增加索引:
db.collection-name.getIndexes();
db.collectoin-name.dropIndex(‘index-name’);
db.collection-name.dropIndexes()
删除集合上的全部索引。
只有在:初始化大量的集合数据时,才可能删除全部索引的。
name选项:
unique:true
要求:已经存在文档,文档的属性不能重复。
如果出现重复,选择选项:
dropDups:true,自动删除掉重复的文档!
要求在 具有2个元素的属性上,创建2d索引:
例如:
对应:
将每个人的坐标,存储到mongo中。快速的检索:
1:谁离我近。距离检索。
2:范围内,谁在。范围检索。
实现:
增加文档数据:
创建gis属性上的,空间二维索引
利用索引检索:
距离检索:{gis: {$near:[x,y]}}
距离降维(0, 0)最近的人儿
范围检索:$within不同的形状,使用不同语法
圆形:$center
矩形范围:$box
master slave
大数据的特征。
大数据:
存储。分布式文件系统。(分片)
分析。map/reduce。
PHP作为mongodb的客户端
mongo,mongodb
下载mongo.dll
解压:
拷贝到PHP的扩展目录中
修改 php.ini
apache restart
测试
面向对象语法。
提供的类:
MongoClient,连接服务器
MongoDB,操作数据库
MongoCollection,操作集合(常用)
MongoCursor,游标,处理数据
操作是无状态的。
典型的过程:
连接,
通过连接得到库,通过库操作集合,通过集合操作文档!
如果是获取查询文档,需要通过游标完成操作。
连接
操作,库,集合,文档
语法与mongo客户端语法,完全一致。
对应的转换:
JS数组:PHP索引数组
JS对象JSON:PHP关联数组
JS回调函数:PHP字符串(符合JS语法格式)
sort(),游标的方法
游标的方法
文档管理类。
不处理关联,不处理频繁的更新。
article
category
tag
user
如果用mongodb管理:
article的集合,分类和tag,都是article的内联文档。
user 的集合
本文出自 “json在php中的使用” 博客,请务必保留此出处http://zhaozhangxiao.blog.51cto.com/10609825/1871095
标签:关系数据库 category 数据库系统 document article
原文地址:http://zhaozhangxiao.blog.51cto.com/10609825/1871095