MongoDB入门

为什么要学习MongoDB?
传统的SQL方式操作数据库过于复杂、 要考虑的问题太多、 容易出错
MongoDB的Bson方式操作数据库学习简易,容易上手
只要设计合理,MongoDB效率可以远超MySql
完全开源免费
各种编程语言完全兼容

什么是MongoDB?
MongoDB是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下(需要更多的存储空间和更强的处理能力),添加更多的节点(这就是所谓的分片),可以保证服务器性能。
MongoDB是面向集合存储的文档型数据库,其涉及到的基本概念与关系型数据库相比有所不同。
MongoDB
关系型数据库

DataBase
DataBase
数据库
Collection
Table
数据库表/集合
Document/BSON Document
Record/Row
数据库记录行/文档
field
Column
数据字段/域
Index
Index
索引

table joins
表连接,MongoDB不支持


MonggoDB文档
文档是MongoDB最核心的概念,本质上时一种类JSON的BSON格式的数据。
BSON是一种类JSON的二进制格式数据,它可以理解为在JSON基础上添加了一些新的数据类型,包括日期、int32、int64等。
BSON是由一组组键值对组成,它具有轻量性、可遍历性和高效性三个特征。可遍历性是MongoDB将BSON作为数据存储的主要原因。
BSON官网地址: http://bsonspec.org/
使用MongoDB文档时需要注意以下问题:
①MongoDB中写操作的原子性限制在文档级别,对文档的保存、修改、删除等都是原子操作
②单个文档占用的存储空间不能超过16MB
③MongoDB会尽量保持文档被插入时键值对的顺序(update时会改变键值对的顺序)
④键值对是有序的
    {"type":1,"status":2}不等于{"status":2,"type":1}
    文档的大小写信息是敏感的
    文档中不能出现重复的键
    文档的值不仅可以是字符串,还可以是其他几种类型,甚至可以是整个嵌入的文档

以下是MongoDB中常用的几种数据类型
数据类型

String

Integer

Boolean

Double

Min/Max keys
将一个值与BSON元素的最低值和最高值相对比
Array
用于将数组或列表或多个值存储为一个键
Timestamp
时间戳。记录文档修改或添加的具体时间
Object ID

Null
用于创建空值
Symbol
符号。该数据类型基本等同于字符串类型,但不同的是,它一般采用特殊符号类型的语言
Date
日期时间。用UNIX时间格式来存储当前日期或时间
Object
用于内嵌文档
Binary Data
二进制数据
Code
代码类型。用于在文档中存储JavaScript代码
Regular expression
正则表达式类型

关于文档键的命名需要注意以下几点:
①_id事故系统保留的关键字,它是默认的主键,该值在集合中必须唯一,且不可更改。
②键名不能包含\0或空字符,这个字符用于表示键的结尾
③不能以$开头
④不能包含.(点号)

MongoDB集合
集合就是一组文档,类似于关系数据库中的表。
集合是无模式的,集合中的文档可以是各式各样的。它们的键值可以不同,值的类型也可以不同,但是它们可以存放在同一个集合中,也就是不同模式的文档都可以放在同一个集合中。
但是如果把各种模式的文档放在同一个集合中,对于开发者来说无疑是灾难的,集合难以管理,对集合的查询、索引等操作效率都不高,在获取到查询结果后还需过滤掉各种不同类型的文档。
所以在实际的使用中,往往将文档分类放在不同的集合中。
这种对文档进行划分来分别存储的模式并不是MongoDB的强制要求,用户可以灵活选择。
可以使用“.”按照命名空间将集合划分为子集合。虽然子集合没有任何特殊的地方,但是使用子集合组织数据结构更清晰。
关于集合的命名需要注意以下几点:
①不能使空字符串
②不能含有\0字符或空字符,这个字符用于表示集合的结尾
③不能以"system."开头,这是为系统集合保留的前缀
④用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统和生成的集合中包含该字符。除非你要访问这种系统穿件的集合,否则千万不要在名字里出现$

元数据
数据库的信息是存储在集合中的。它们使用了系统的命名空间:
dbname.system.*
在MongoDB数据库中名字空间<dbname>.system.*是包含多种系统信息的特殊集合(Collection)
集合命名空间 描述
dbname.system.namespaces 列出所有名字空间。
dbname.system.indexes 列出所有索引。
dbname.system.profile 包含数据库概要(profile)信息。
dbname.system.users 列出所有可访问数据库的用户。
dbname.local.sources 包含复制对端(slave)的服务器信息和状态。

MongoDB数据库
MongoDB中多个文档组成集合,多个集合组成数据库。
一个MongoDB实例可以承载多个数据库。它们之间可以看做相互独立,每个数据库都有独立的权限控制。在磁盘上,不同的数据库存放在不同的文件中。
MongoDB中存在以下系统数据库:
①Admin:权限数据库,如果创建用户的时候将该用户添加到admin数据库中,那么该用户就自动继承了所有数据库的权限。
②Local:这个数据库永远不会被复制,可以用来存储本地单台服务器的任意集合。
③Config:当MongoDB使用分片模式时,config数据库在内部使用,用于保存分片的信息


MongoDB文档的嵌入和引用
对于关系型数据库,不同类型的信息需存入不同的表中。查询某些关联的信息时,需要检索多个表。
但是对于mongoDB或者其他非关系型数据库来说,可以将关联的信息嵌入在单一的文档中。
每个MongoDB文档都由BSON文档组成,有类似JSON格式一样的数据类型,其中String、Int、Float称为基本类型(或常量),而Hash和Array称之为复合类型。
所谓的嵌套,就是说文档中,利用复合类型,包裹一个多或多个其他类型的值,这些值称之为子文档。
文档嵌套的数量和深度没有限制,但MongoDB目前版本限制一个文档最大为16MB。
采用这种方法维持了数据逻辑上的完整性,可以将一整项数据作为一个整体来操纵。对比在关系型的数据库中,为了设计出符合规范的表,我们常常要将多个数据项才分为几个表,然后通过外键来获取数据。这样做的后果是,当我们只看一个单独的表的数据时,通常只能看到一部分数据,而其他的都是外键id,影响了可读性和逻辑的完整性。
检索时,只需要数据从一个文档加载到内存中,不必加载多个文档,提高了检索效率。

mongodb是介于关系型与非关系型数据库之间的,mongodb的join查询可以通过引用来实现。
mongodb的引用是通过额外的执行一次查询来解决的。
mongodb提供了两种方式来实现:手动引用和使用DBRef标准
①手动引用
手动引用就是在文档中插入要引用文档的id,检索时,通过_id进行一次额外的检索就可以获取所需的信息了
②DBRef
DBRef提供了一个更正式的规范引用文档之间的数据
在DBRef中,数据库引用以标准的JSON/ BSON嵌入对象存储的。
语法: 
{ $ref : <collectionname>, $id : <id value>[, $db : <database name>] }
<collectionname>代表引用的集合的名称。
<id value>所引用的文档的_id值。
$ db是可选的,引用的文档所在的数据库的名称。

参考:

猜你喜欢

转载自blog.csdn.net/u013162930/article/details/51564870