MongoDB入门
Posted lc__________
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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是可选的,引用的文档所在的数据库的名称。
参考: http://www.runoob.com/mongodb/mongodb-tutorial.html http://www.ttlsa.com/nosql/mongodb/
以上是关于MongoDB入门的主要内容,如果未能解决你的问题,请参考以下文章