MongoDB的文档(Document)与集合(Collection)
文档:MongoDB是面向集合存储的文档型数据库,其涉及到的基本概念与关系型数据库比有所不同。
文档是MongoDB最核心的概念,本质上是一种类JSON的BSON格式的数据。
BSON是一种类JSON的二进制格式的数据,它可以理解为在JSON基础上添加了一些新的数据类型,包括日期、int32、int64等
BSON是由一组组键值对组成,它具有轻量性、可遍历性和高效性三个特征。可遍历性是MongoDB将BSON作为数据存储的主要原因
{
field1:value1,
field2:value2,
field3:value3,
…
fieldn:valuen
}
使用MongoDB文档时需要注意以下问题:
mongoDB中写操作的原子性限制在文档级别,对文档的保存、修改、删除等都是原子操作
单个文档占用的存储空间不能超过16M
MongoDB会尽量保持文档被插入时键值对的顺序
关于文档键的命名需要注意以下几点:
_id是系统保留的关键字,它是默认的主键,该值在集合中必须唯一,且不可更改
键不能包含\0或空字符,这个自负用于表示键的结尾
不能以$开头
不能包含.(点号)
键是区分大小写的且不能重复
集合:
把一组相关的文档放到一起组成了集合,如果将MongoDB的一个文档比喻为关系型数据库的一行,那么一个集合就相当于一张表。
MongoDB的集合是模式自由的,一个集合里面的文档可以是各式各样的。例如:下面的两个文档可以出现在同一集合中。
{“name”:”arthur”}
{“name”:”arthur”,”sex”:”male”}
MongoDB提供了一些特殊功能的集合,例如:capped collection、system.indexes、system.namespaces等。
关于集合的命名需要注意以下几点:
集合名不能是空字符串(“”)
集合名不能包含有\0字符(空字符),该字符表示集合名的结尾
集合名不能以“system.”开头,次前缀是系统本身保留的
集合名不能包含$字符(注:可包含.)
数据库:
多个文档组成集合,而多个集合组成了数据库。一个MongoDB实例可以承载多个数据库,每个数据库都有独立的权限,在磁盘上,不同的数据库也可以放置在不同的文 件夹中(启动时加directoryperdb选项)
为了更好的组织数据,一般情况下,会把属于同一个应用程序(或同一种业务类型)的所有数据放到一个数据库中
关于数据库的命名需要注意一下几点:
不能是空字符串(“”)
不能以$开头
不能包含.(点号)和空字符串
数据库名字区分大小写(建议数据库名全部使用小写)
数据名长度最多为64个字符
不要与系统保留的数据库名字相同,这些数据库包括:admin、local、config等
命名空间:
把数据库名添加到集合名前面,中间用点号连接,得到集合的完全限定名,就是命名空间,例如:命名空间mymongo.log
需要说明的是,点号还可以出现在集合名字中,例如:mymongo.log.info,可以将info集合看作是log的子集合。
使用子集合可以使我们更好的组织数据,使数据的结构更加清晰明了。
==================================================================================================================
MongoDB数据类型
简介:BSON可以理解为在JSON基础上添加了一些新的数据类型,包括Date,正则表达式,对数值类型的进一步划分等。
基本数据类型:
null 表示空值或不存在的字段 例如:db.collection.find({“x”:null})
布尔 有两个值true或false例如:{“x”:true}
数值类型 支持32-int、64-int以及64-double
注:JavaScript只支持64位浮点数
例如:{“x”:10}{“x”:NumberInt(10)}
字符串 使用UTF-8对字符串进行编码 例如:{“x”:”Hello MongoDB”}
二进制数据 可以保存由任意字节组成的字符串,例如:图片、视频等
正则表达式 主要用于查询,使用正则表达式作为限定条件
例如:{name:/mydb/}name字段含有mydb的文档
{name:/mydb/i} name字段含有mydb的文档,且不区分大小写
{name:/^mydb/i} name字段以mydb开头,且不区分大小写
JavaScript代码文档中可以包含任意的JavaScript代码
例如:{“func”:function(){} }
Date日期:
MongoDB中,日期类型是一个64为的整数,它代表的是距Unix epoch的毫秒数
MongoDB在存储时间时,先转化为UTC时间
北京时间(CST)=UCT+8个小时
MongoDB Shell中可以使用new Date或ISODate来创建时间对象,在进行显示时,Shell会根据本地时间去设置显示日期对象
Timestamp:
时间戳类型有两部分组成:
32bit-Nnix epoch | 32bit-自增序数(同一秒)
Timestamp只供MongoDB数据库服务内部使用,用于记录操作的详细时间
Timestamp类型和Date类型是没有关系的
相关函数:Timestamp()
ObjectId:
ObjectId由24个16进制字符构成,每个字节存储两位十六进制数字,总共需要12字节存储空间
例如:{“_id”:ObjectId(“55212126e053e401e3efe46”)}
相关函数:ObjectId()、getTimestamp()、valueOf()
内嵌文档:
文档可以作为键的值,这样的文档称为内嵌文档。内嵌文档可以使数据不用保存成扁平结构的键值对,从而使数据组织方式更加自然。
数组:
数组是使用方括号来表示的一组值,它既可以作为有序对象(列表、栈、队列),也能作为无需对象(如集合)来操作
数组中可以包含不同数据类型的元素(字符串、浮点数、文档等)
例如:[3.14,”hello”,[1,2,3],{“key”:”MongoDB”}
针对数组MongoDB提供了许多特定的操作符,例如:$puah,$pop,$pull,$slice,$addToSet等
MongoDB可自动的为数组元素建立Multikey索引
==================================================================================================================
MongoDB Shell简介与使用
简介:
MongoDB Shell是MongoDB自带的JavaScript Shell,随MongoDB一同发布,他是MongoDB客户端工具,可以在Shell中使用命令与MongoDB实例交互,对数据库的管 理操作(CURD、集群配置、状态查看等)都可以通过MongoDB Shell来完成。
MongoDB Shell = JavaScript解释器 + MongoDB客户端
基本功能:
执行JavaScript命令
MongoDB客户端——基本命令
连接/切换数据库 例如:use mymongo;
数据插入 例如:db.user.insert(obj);
数据查询 例如:db.user.find(query);
数据更新 例如:db.user.update(query, obj);
数据删除 例如:db.user.remove(query);
使用技巧:
help查看帮助
执行脚本
直接运行 例如:mongo [quiet] script.js(quiet参数可选,加上不会输出MongoDB Shell默认的提示)
script.js
运行结果
交互式运行 例如:load(“script.js”)
执行命令行程序例如:run(“ls”)
.mongorc.js文件使用
MongoDB启动时会自动加载用户主目录下的mongorc.js文件,我们可以将频繁使用的功能放入到该脚本中
编辑复合变量EDITOR
MongoDB Shell对多行输入使很不友好的,所以对于大块的代码和对象,我们放到编辑器中进行编辑
首先向系统变量中添加一个EDITOR变量
在mongorc.js中添加EDITOR变量
新建一条文档,使用edit命令编辑这条文档
查看修改后的文档
可以看到文档已经成功修改