安徽省建设厅网站 职称,网站开发项目延期说明,恋爱ppt模板免费下载网站,软件网站开发团队名称一、概述
1.1介绍 MongoDB是一个基于分布式文件存储的数据库。由C语言编写。旨在为WEB应用提供可扩展高性能数据存储解决方案。(并不是单纯的内存数据库)#xff0c;官方地址 https://www.mongodb.com/ 操作语法与 JavaScript 类似#xff0c;容易上手#xff0c;学习成本低…一、概述
1.1介绍 MongoDB是一个基于分布式文件存储的数据库。由C语言编写。旨在为WEB应用提供可扩展高性能数据存储解决方案。(并不是单纯的内存数据库)官方地址 https://www.mongodb.com/ 操作语法与 JavaScript 类似容易上手学习成本低 Mongodb 中有三个重要概念需要掌握数据库database 数据库是一个数据仓库数据库服务下可以创建很多数据库数据库中可以存放很多集合 集合collection 集合类似于 JS 中的数组在集合中可以存放很多文档文档document 文档是数据库中的最小单位类似于 JS 中的对象 特点 - 面向集合存储易存储对象类型的数据 - 支持查询,以及动态查询 - 支持RUBYPYTHONJAVACPHPC#等多种语言 - 文件存储格式为BSON一种JSON的扩展 - 支持复制和故障恢复和分片 - 支持事务支持 - 索引 聚合 关联.... 应用场景 游戏应用使用云数据库MongoDB作为游戏服务器的数据库存储用户信息。用户的游戏装备、积分等直接以内嵌文档的形式存储方便进行查询与更新。物流应用使用云数据库MongoDB存储订单信息订单状态在运送过程中会不断更新以云数据库MongoDB内嵌数组的形式来存储一次查询就能将订单所有的变更读取出来方便快捷且一目了然。社交应用使用云数据库MongoDB存储用户信息以及用户发表的朋友圈信息通过地理位置索引实现附近的人、地点等功能。并且云数据库MongoDB非常适合用来存储聊天记录因为它提供了非常丰富的查询并在写入和读取方面都相对较快。视频直播使用云数据库MongoDB存储用户信息、礼物信息等。大数据应用使用云数据库MongoDB作为大数据的云存储系统随时进行数据提取分析掌握行业动态。 1.2安装
详情请见Docker容器五Docker Compose
启动
mongo --host example.com:27017 -u myUser -p myPassword
图形化管理工具 我们可以使用图形化的管理工具来对 Mongodb 进行交互这里演示两个图形化工具 Robo 3T 免费 Releases · Studio3T/robomongo · GitHub Navicat 收费 Navicat 中国 | 支持 MySQL、Redis、MariaDB、MongoDB、SQL Server、SQLite、Oracle 和 PostgreSQL 的数据库管理 1.3相关概念
文档
文档集合中一条条记录是一组键值(key-value)对(即 BSON)。MongoDB 的文档不需要设置相同的字段并且相同的字段不需要相同的数据类型这与关系型数据库有很大的区别也是 MongoDB 非常突出的特点。
多个键及其关联的值有序地放在一起就构成了文档。MongoDB文档类似于JSON对象。字段的值可以包括其他文档数组和文档数组。 {“greeting”:“hello,world”}这个文档只有一个键“greeting”对应的值为“hello,world”。多数情况下文档比这个更复杂它包含多个键/值对。
例如{“greeting”:“hello,world”,“foo”: 3} 文档中的键/值对是有序的下面的文档与上面的文档是完全不同的两个文档。{“foo”: 3 ,“greeting”:“hello,world”}
文档中的值不仅可以是双引号中的字符串也可以是其他的数据类型例如整型、布尔型等也可以是另外一个文档即文档可以嵌套。文档中的键类型只能是字符串。
使用文档的优点是
文档即对象对应于许多编程语言中的本机数据类型嵌入式文档和数组减少了对昂贵连接的需求动态模式支持流畅的多态性
集合
集合就是一组文档类似于关系数据库中的表。
集合存在于数据库中一个库中可以创建多个集合。每个集合没有固定的结构这意味着你在对集合可以插入不同格式和类型的数据但通常情况下我们插入集合的数据都会有一定的关联性。
既然集合中可以存放任何类型的文档那么为什么还需要使用多个集合 数据库
mongodb中的库就类似于传统关系型数据库中库的概念用来通过不同库隔离不同应用数据。mongodb中可以建立多个数据库。每一个库都有自己的集合和权限不同的数据库也放置在不同的文件中。默认的数据库为test数据库存储在启动指定的data目录中。
MongoDB 中存在以下系统数据库。
Admin 数据库一个权限数据库如果创建用户的时候将该用户添加到admin 数据库中那么该用户就自动继承了所有数据库的权限。Local 数据库这个数据库永远不会被复制可以用来存储本地单台服务器的任意集合。Config 数据库当MongoDB 使用分片模式时config 数据库在内部使用用于保存分片的信息。
与关系数据库管理系统区别
RDBMS MongoDB 数据库database 数据库database 表table集合collection行row 文档document 列colume 字段field
数据模型 一个MongoDB 实例可以包含一组数据库一个DataBase 可以包含一组Collection集合一个集合可以包含一组Document文档。 一个Document包含一组field字段每一个字段都是一个key/value pair key: 必须为字符串类型value可以包含如下类型 基本类型例如stringintfloattimestampbinary 等类型一个document数组类型 二、MongoDB基本操作及增删改查
2.1数据库操作
登陆数据库
mongo
查看数据库选择数据
show databases; 注意: use 代表创建并使用,当库中没有数据时默认不显示这个库 选择数据库
use 数据库名 如果切换到一个没有的数据库例如use admin2那么会隐式创建这个数据库。后期当该数据库有数据时系统自动创建 显示当前所在的数据库
db
删除当前数据库
use 库名
db.dropDatabase()
2.2集合操作
创建集合
db.createCollection(集合名称, [options])
字段类型描述capped布尔可选如果为 true则创建固定集合。固定集合是指有着固定大小的集合当达到最大值时它会自动覆盖最早的文档。 当该值为 true 时必须指定 size 参数。size数值可选为固定集合指定一个最大值即字节数。 如果 capped 为 true也需要指定该字段。max数值可选指定固定集合中包含文档的最大数量。
查看集合
show collections
删除集合
db.集合名.drop()重命名集合
db.集合名.renameCollection(newName)
2.3文档操作
插入文档
db.集合名.insert(文档对象);
db.aaa.insert({_id: 123});如果集合存在那么直接插入数据。如果集合不存在那么会隐式创建。
示例在test2数据库的c1集合中插入数据姓名叫webopenfather年龄18岁
use test2 db.c1.insert({uname:webopenfather,age:18})数据库和集合不存在都隐式创建对象的键统一不加引号方便看但是查看集合数据时系统会自动加mongodb会给每条数据增加一个全球唯一的_id键
一次性插入多条数据
传递数据数组中写一个个JSON数据即可
db.aaa.insert([ {uname:z3, age:3}, {uname:z4, age:4}, {uname:w5, age:5} ])快速插入10条数据
由于mongodb底层使用JS引擎实现的所以支持部分js语法。因此可以写for循环
for (var i1; i10; i) { db.aaa.insert({uanme: ai, age: i}) }查询文档
db.集合名.find(条件[,查询的列])
_id 是 mongodb 自动生成的唯一编号用来唯一标识文档
条件写法查询所有的数据{}或者不写查询age6的数据{age:6}既要age6又要性别男{age:6,sex:‘男’}
查询的列可选参数写法查询全部列字段不写只显示age列字段{age:1}除了age列字段都显示{age:0}
db.aaa.find()其他语法
db.集合名.find({键:{运算符值}})运算符作用$gt大于$gte大于等于$lt小于$lte小于等于$ne不等于$inin$ninnot in
更新文档 db.集合名称.update(query,update,{upsert: boolean,multi: boolean,writeConcern: document}); 参数说明 query : update的查询条件类似sql update查询内where后面的。update : update的对象和一些更新的操作符如,,inc...等也可以理解为sql update查询内set后面的。upsert : 可选这个参数的意思是如果不存在update的记录是否插入objNew,true为插入默认是false不插入。multi : 可选mongodb 默认是false,只更新找到的第一条记录如果这个参数为true,就把按条件查出来多条记录全部更新。writeConcern :可选抛出异常的级别。 update 方法默认只会更新符合查询条件的第一条文档。这是因为在进行更新操作时MongoDB默认只会更新匹配的第一条文档除非你显式指定 multi: true 选项这样才会更新所有匹配的文档。例如你可以这样使用 update 方法来更新所有匹配的文档db.集合名.update(查询条件, 更新操作, { multi: true }) 删除文档
db.集合名称.remove(query,{justOne: boolean,writeConcern: document}) 参数说明 query :可选删除的文档的条件。justOne : 可选如果设为 true 或 1则只删除一个文档如果不设置该参数或使用默认值 false则删除所有匹配条件的文档。writeConcern :可选抛出异常的级别。 总结 插入文档db.集合名.insert(文档对象); 查询文档db.集合名.find(查询条件) _id 是 mongodb 自动生成的唯一编号用来唯一标识文档 更新文档db.集合名.update(查询条件,新的文档) 默认全部子弹更新db.集合名.update({name:张三},{$set:{age:19}}) 指定字段更新 删除文档db.集合名.remove(查询条件) 2.4文档查询
MongoDB 查询文档使用 find() 方法。find() 方法以非结构化的方式来显示所有文档。
如果你需要以易读的方式来读取数据可以使用 pretty() 方法语法格式如下
db.集合名称.find().pretty()
注意: pretty() 方法以格式化的方式来显示所有文档。 and
db.集合名称.find({key1:value1, key2:value2,...}).pretty()
类似于 WHERE 语句WHERE key1value1 AND key2value2
OR
MongoDB OR 条件语句使用了关键字 **$or**,语法格式如下
db.集合名称.find({$or: [{key1: value1}, {key2:value2}]}
).pretty() 类似于 WHERE 语句WHERE key1value1 or key2value2
AND 和 OR 联合
db.集合名称.find({age: {$gt:50}, $or: [{name: 编程不良人},{name: MongoDB}]}).pretty();
类似SQL语句为where age 50 AND (name 编程不良人 OR name MongoDB)
数组中查询 db.aaa.insert({ _id : 11, age : 29, likes : [ 看电视, 读书xx, 美女 ], name : 不良人_xx_11 })
-- 执行数组查询db.users.find({likes:看电视})
-- $size 按照数组长度查询db.users.find({likes:{$size:3}});
模糊查询
db.aaa.find({likes:/良/});
类似 SQL 中为 where name like %name%
排序
db.集合名称.find().sort({name:1,age:1}),
- 1 升序 -1 降序
类似 SQL 语句为: order by name,age
分页
db.集合名称.find().sort({条件}).skip(start).limit(rows); db.集合名称.find().sort({条件}).skip(start).limit(rows);
总条数 db.集合名称.count();db.集合名称.find({name:编程不良人}).count();
类似于 SQL 语句为: select count(id) from ....
去重
db.集合名称.distinct(字段) 类似于 SQL 语句为: select distinct name from ....
三、MongoDB存储数据类型 BSON是一种类JSON的二进制形式的存储格式简称Binary JSON它和JSON一样支持内嵌的文档对象和数组对象但是BSON有JSON没有的一些数据类型如Date和BinData类型MongoDB使用BSON做为文档数据存储和网络传输格式。、
数字
shell默认使用64位浮点型数值如下
db.sang_collec.insert({x:3.1415926})
db.sang_collec.insert({x:3})对于整型值我们可以使用NumberInt或者NumberLong表示如下
db.sang_collec.insert({x:NumberInt(10)})
db.sang_collec.insert({x:NumberLong(12)})字符串
字符串也可以直接存储如下
db.sang_collec.insert({x:hello MongoDB!})数组
数组一样也是被支持的如下
db.sang_collec.insert({x:[1,2,3,4,new Date()]})数组中的数据类型可以是多种多样的。
日期
MongoDB支持Date类型的数据可以直接new一个Date对象如下
db.sang_collec.insert({x:new Date()})内嵌文档
一个文档也可以作为另一个文档的value这个其实很好理解如下
db.sang_collect.insert({name:三国演义,author:{name:罗贯中,age:99}});书有一个属性是作者作者又有name年龄等属性。
四、MongoDB 中的索引
索引通常能够极大的提高查询的效率如果没有索引MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。这种扫描全集合的查询效率是非常低的特别在处理大量的数据时查询可以要花费几十秒甚至几分钟这对网站的性能是非常致命的。索引是特殊的数据结构索引存储在一个易于遍历读取的数据集合中索引是对数据库表中一列或多列的值进行排序的一种结构。 索引创建
默认情况下集合中的_id字段就是索引我们可以通过getIndexes()方法来查看一个集合中的索引
db.aaa.getIndexes() 现在我的集合中有10000个文档我想要查询x为1的文档我的查询操作如下
db.sang_collect.find({x:1})这种查询默认情况下会做全表扫描我们可以用上篇文章介绍的explain()来查看一下查询计划如下
db.sang_collect.find({x:1}).explain(executionStats)db.集合名称.createIndex(keys, options)db.集合名称.createIndex({title:1,description:-1}) 说明: 语法中 Key 值为你要创建的索引字段1 为指定按升序创建索引如果你想按降序来创建索引指定为 -1 即可。 一个索引的值是由多个 key 进行维护的索引的称之为复合索引 ParameterTypeDescriptionbackgroundBoolean建索引过程会阻塞其它数据库操作background可指定以后台方式创建索引即增加 background 可选参数。 background 默认值为false。uniqueBoolean建立的索引是否唯一。指定为true创建唯一索引。默认值为false.namestring索引的名称。如果未指定MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。sparseBoolean对文档中不存在的字段数据不启用索引这个参数需要特别注意如果设置为true的话在索引字段中不会查询出不包含对应字段的文档.。默认值为 false.expireAfterSecondsinteger指定一个以秒为单位的数值完成 TTL设定设定集合的生存时间。vindex version索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。weightsdocument索引权重值数值在 1 到 99,999 之间表示该索引相对于其他索引字段的得分权重。default_languagestring对于文本索引该参数决定了停用词及词干和词器的规则的列表。 默认为英语language_overridestring对于文本索引该参数指定了包含在文档中的字段名语言覆盖默认的language默认值为 language.
查看索引
getIndexes()可以用来查看索引我们还可以通过totalIndexSize()来查看索引的大小如下
db.sang_collect.totalIndexSize()
删除索引
我们可以按名称删除索引如下
db.sang_collect.dropIndex(xIndex)
表示删除一个名为xIndex的索引当然我们也可以删除所有索引如下
db.sang_collect.dropIndexes() 总结
索引是个好东西可以有效的提高查询速度但是索引会降低插入、更新和删除的速度因为这些操作不仅要更新文档还要更新索引MongoDB 限制每个集合上最多有64个索引我们在创建索引时要仔细斟酌索引的字段。