MongoDB数据库介绍
- 名称源自"humongous"(意为"巨大无比")。
- MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
- 在高负载的情况下,添加更多的节点,可以保证服务器性能。
- MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
- 官方网站:https://www.mongodb.com/
- 官方文档:https://www.mongodb.com/docs/manual/
- MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成.MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
- 主要特点:
- 提供了一个面向文档存储,操作起来比较简单和容易
- 可以设置任何属性的索引来实现更快的排序
- 具有较好的水平可扩展性
- 支持丰富的查询表达式,可轻易查询文档中内嵌的对象及数组
- 可以实现替换已完成文档的一些指定的数据字段
- MongoDB可以对数据进行批量处理和聚合操作
- 支持复制和故障恢复
- 支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等语言
- MongoDB安装简单
- 适用场景:MongoDB更多适合于大数据量、高并发、弱事务的互联网应用,其内置的水平扩展机制提供了从几百万到十亿级别的数据处理能力,可以很好的满足Web2.0和移动互联网应用的数据存储要求。
MongoDB数据库的安装和使用
- MongoDB Server下载地址: https://www.mongodb.com/download-center/community
- Shell客户端下载地址:https://www.mongodb.com/products/shell
- MongoDB Compass图形化客户端下载地址: https://www.mongodb.com/products/compass
- 启动/关闭MongoDB服务:
- MongoDB安装目录的bin目录下,双击mongod.exe,即可启动服务
- 关闭MongoDB服务在计算机服务中停止即可。
- 使用MongoDB服务:
- MongoDB Shell是MonoDB客户端工具,可以在Shell中使用命令与MongoDB实例交互,对数据库的管理操作(CURD、集群配置、状态查看等)都可以通过MongoDB Shell来完成。
- MongoDB Shell = JavaScirpt解释器 + MongoDB客户端
- 使用MongoDB Shell访问MongoDB:
- 双击mongosh.exe,输入命令mongodb://127.0.0.1:27017,其中127.0.0.1为所连机器的ip,27017为默认的MongoDB端口号
- 默认的数据库为test数据库
- 使用MongoDB Shell运行js脚本:
- OS命令行下,运行一个js文件,Mongosh的bin目录添加到环境变量中,命令行中输入 mongosh [--quiet] D:/script.js
- 在mongo shell 交互模式下,运行一个js文件输入 load('D:/script.js')
- .mongoshrc.js 文件(位于用户主目录)启动shell时会自动加载运行,加上--norc参数,就可以禁止加载
MongoDB概念解析
解析
举例:在一个关系型数据库中,一篇博客(包含文章内容、评论、评论的投票)会被打散在多张数据表中。在文档数据库MongoDB中,能用一个文档来表示一篇博客, 评论与投票作为文档数组,放在正文主文档中。这样数据更易于管理,消除了传统关系型数据库中影响性能和水平扩展性的"JOIN"操作:
数据库
- 一个Mongodb中可以建立多个数据库
- MongoDB的默认数据库为"test",该数据库存储在data目录中
- MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中
- 多个文档组成集合,而多个集合组成了数据库
- show dbs 命令可以显示所有数据库的列表
数据库命名
- 不能是空字符串("")
- 不能以$开头
- 不能含有.和空字符串。
- 数据库名字区分大小写(建议数据库名全部使用小写)
- 数据库名字长度最多64字节。
- 不要与系统保留的数据库名字相同,这些数据库包括:admin、local、 config等
集合
- 集合就是 MongoDB文档组,类似于RDBMS 中的表格。
- 集合存在于数据库中,没有固定的结构,这意味着可对集合可以插入不同格式和类型的数据
- MongoDB 数据类型较多,有字符型、整型、布尔型、双精度等
- MongDB提供了一些特殊功能的集合,例如:capped、collection,system.indexes,system.namespaces等。
集合命名
- 集合名不能是空字符串""
- 集合名不能含有\0字符(空字符),(表示集合名的结尾)
- 集合名不能以system.开头,此前缀是系统本身保留的
- 集合名中不能包含$字符(注:可包含.)
文档
- 文档是MongoDB最核心的概念,本质是一种类JSON的BSON格式的数据。
- BSON是一种类JSON的二进制格式数据,它可以理解为JSON基础上添加了一些新的数据类型,包括日期、int32、int64等。
- BSON是由一组组键值对组成,它具有轻量性、可遍历性和高效性三个特征。可遍历性是MongoDB将BSON作为数据存储的主要原因。
- BSON官网地址:http://bsonspec.org/
文档注意
- MongoDB中写操作的原子性限制在文档级别,对文档的保存、修改、删除等都是原子操作
- 单个文档占用的存储空间不能超过16MB
- MongoDB会尽量保持文档被插入时键值对的顺序
文档命名
- _id是系统保留的关键字,它是默认的主键,该值在集合中必须唯一,且不可修改
- 键不能包含\0或空字符。(这个字符用于表示键的结尾)
- 不能以$开头
- 不能包含.(点号)
- 键是区分大小写的且不能重复 例如:{foo:1,Foo:1}
命名空间
- 把数据库名添加到集合名字前面,中间用点号连接,得到集合的完全限定名,就是命名空间,例如:命名空间database.parent 。
- 需要说明的是,点号还可以出现在集合名字中,例如:parent.subling0,parent.subling1可以将subling0和subling1集合看作是parent集合的子集合。
- 使用子集合可以使我们更好的组织数据,使数据的结构更加清晰明了
简单语句
- 创建/切换数据库:use db1
- 查看所有数据库:show dbs
- 删除当前数据库:db.dropDatabase()
- 创建集合:db.createCollection("c1")
- 创建集合并添加数据db.dept.insertOne({deptno:1,deptname:"技术部",location:"beijing"})
- 查看集合:show collections
- 删除集合:db.collection_name.drop()
- 查看所有文档数据:db.dept.find()
- 查看单独的一个文档:db.dept.findOne()
MongoDB数据类型简介
BSON可以理解为在JSON基础上添加了一些新的数据类型,包括Date,正则表达式,对数值类型的更进一步划分等。
- MongoDB 中 $type 是一个条件操作符。 $type 基于 BSON 类型来检索集合中匹配的数据类型,并返回结果。
- 由于 MongoDB 对于文档(记录)的格式要求比较自由,所以同一个KEY(字段)中可以包含不同类型的数值。$type 用于过滤指定类型的数据:
- db.collection.find({KEY : {$type : TYPE_NAME}})
- db.stu.find({name:{$type:2}})
MongoDB数据类型应用
- null :表示空值或不存在的字段。 例如db.collection.find({age:null})
- 布尔:有两个值true或false 。例如:{y:true}
- 数值类型: 支持32-int、64-int以及64-double如果使用mongodb shell表示数字,默认都是浮点型
- {y:10} -- double
- y:NumberInt(10)} - 32
- {y:NumberLong(10)} - 64
- 字符串:使用UTF-8对字符串进行编码。例如:{y:"Hello MongoDB"}
- 二进制数据可以保存由任意字节组成的字符串,例如:图片、视频等。
- 正则表达式:主要用于查询,使用正则表达式作为限定条件
- {name:/foo/} name字段含有foo的文档
- {name:/foo/i} name字段含有foo的文档,且不区分大小写
- {name:/^foo/i} name字段以foo幵头,且不区分大小写
- JavaScript代码:文档中可以包含任意的JavaScript代码
- {func:function functionname( ){}}
- Date日期:MongoDB中,日期类型是一个64位的整数,它代表的是Unix epoch的毫秒数,MongoDB在存储时间时,先转化为UTC时间
- 北京时间(CST) = UTC + 8个小时
- MongoDBShell中可以使用new Date或ISODate来创建时间对象,使用Date以字符串的形式返回当前日期。
- 时间戳类型有两部分组成:Timestamp只供MongoDB数据库服务内部使用,用于记录操作的详细时间,Timestamp类型和Date类型是没有关系的,对于我 们来说使用更多的Date类型。
- 获取当前时间的时间戳:Date.parse(new Date())
- ObjectId:由24个十六进制字符构成,每个字节存储两位十六进制数字,总共需要12字节存储空间
-
例如:{"_id":ObjectId("5a7866e75640374fb2cd5623")}
-
每个字节代表的含义如下:
-
相关函数:
- ObjectId() 用于创建ObjectID
- getTimestamp() 用于取得ObjectID的时间戳
- valueOf() 用于取得ObjectID的字符串表示
-
- 内嵌文档:文档可以作为键的值,这样的文档称为内嵌文档。内嵌文档可以使数据不用保存成扁平结构的键值对,从而使数据组织方式更加自然。
例如:下面是一个与博客管理有关的文档
{ _id: ,
title: MongoDBDateModeln,
author: foo,
comments:[
{who:"John",comment:"Good"},
{who:"Joe",comment:"ExceUent"}]
}
- 数组:数组是使用[]来表示的一组值,它既可以作为有序对象(列表、栈、队列),也能作为无序对象(如集合)来操作。
- 数组中可以包含不同数据类型的元素(字符串、浮点数、文档等)
例如:[3.14,"hello",[l2,3],{"key":"MongoDB"}] - 针对数组MongoDB提供了许多特定的操作符,例如:$ push, $ pop,$ pull,$ slice,$addToSet等
- MongoDB可自动的为数组元素建立Multikey索引