未加星标

MongoDB 入门指南

字体大小 | |
[数据库(综合) 所属分类 数据库(综合) | 发布者 店小二04 | 时间 2016 | 作者 红领巾 ] 0人收藏点击收藏

MongoDB 是一个开源的, 基于分布式文件存储的文档性数据库,由C++编写,旨在为WEB应用提供可拓展的高性能数据存储解决方案。

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson(Binary JSON)格式,因此可以存储比较复杂的数据类型。MongoDB最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

主要特征 无模式优点 存储形式,相较于传统的关系型数据库,它可以使用一个表(在MongoDB中表对应的是集合)存储原来需要多表关联才能存储的数据。 存储动态性,相较于传统的数据库当要增加一个属性值的时候要对表结构进行变动,而MongoDB的面向文档的形式可以使其属性值轻易的增加和删除。 高性能

MongoDB 提供高性能的数据持久化。特别是:

对嵌入数据模型的支持降低了了数据库系统中的输入/输出活动。 索引支持更快的查询,并且可以包括嵌入文档和数组的键 高可用性

MongoDB的复制设备,称为副本集,提供:

自动的故障恢复 数据冗余

A replica set is a group of MongoDB servers that maintain the same data set, providing redundancy and increasing data availability

即 副本集是一组MongoDB服务器,这组服务器维护这相同的数据集,提供冗余和提高数据的可用性。

多个存储引擎的支持

MongoDB支持多个存储引擎,例如:

WiredTiger 存储引擎 MMAP 存储引擎

此外MongoDB 3.0 还引入插件式存储引擎API, 为第三方的存储引擎厂商加入MongoDB提供了方便,这一变化参考了mysql的设计理念。

当然还有其他特性,这里就不一一介绍了。

基本概念

在MongoDB中基本的概念是文档、集合、数据库。

文档 document

文档是MongoDB的核心概念,是数据的基本单元,非常类似于关系数据库中的行。在MongoDB中,文档表示为键值对的一个有序集。

使用文档的优势在于:

文档(例如,对象)对应许多编程语言中自然地数据类型 嵌入文档及数组减少了昂贵的joins操作的需求。 动态的设计模式流畅的多态。

MongoDB中的一条记录就是一个文档,是一个数据结构,由字段和值对组成。MongoDB文档与JSON对象类似。字段的值有可能包括其他文档、数据以及文档数组。

{ "name":"wangjun", "age":20, "email":["wang1","wang2","wang3"], "schools":{ "xiao":"zhongfengxiaoxue", "da":"zhongfengdaxue" } } { "Name":"wangjun", "Age":20, "email":["wang1","wang2","wang3"], "schools":{ "xiao":"zhongfengxiaoxue", "da":"zhongfengdaxue" } } { "name":"wangjun", "email":["wang1","wang2","wang3"], "age":20, "schools":{ "xiao":"zhongfengxiaoxue", "zhong":"zhongfengzhongxue", "da":"zhongfengdaxue" } }

上面是三个不同文档,说明一下问题:

文档的键值对是有序的,顺序不同文档不同 文档的值可以是字符串, 整数、数组以及文档等类型,即文档是可以嵌套的 文档区别大小写以及值类型,例如文档1,2 文档的键常见的是是用双引号标识的字符串。对于文档的键有一下需要注意的: 键不能含有\0(空字符), 这个字符用来标志键的结尾 . 和 $ 被保留,存在特别含义,最好不要用来命名键名 _ 开头的键是保留的,建议不要使用 集合 collection

集合是文档的容器,可以将其视为关系数据库中的表

集合有以下特点:

集合是无模式的,也就是说集合可以存储不同类型的文档。 集合的名字不能是空字符串。 集合名字中不能包含空格(\0),其作为集合名字的结尾。 集合名字不能以system.开头,此是为系统集合保留的关键字。 集合名字不能包含$

特别讲一下上面说的集合的无模式,也称为动态模式。

集合是动态模式的,具体来说就是一个集合里面的文档可以使各式各样的:

{"title": "hello!"} {"recommend": 5}

这个关系型数据库中的一个表中只能存放相同模型的数据结构显得很不一样。但也产生了一个问题:既然一个集合中可以存放任意的文档,那么多个集合的存在还有什么必要性呢?

这其实可以和关系型数据库表对应起来理解,我们可以创建一张表来容纳上面提到的title和recommend列,但是总有一个列是NUll的。这仅仅是两个列的情况,如果出现很多类,那么这种情况就很糟糕了,造成了很多浪费。

我们不难想出一个数据库中存在多个集合的原因如下:

只有一个集合将会导致数据混乱。开发人员要区分每次查询只返回特定类型的文档,或者把这个区分交给处理查询结果的应用程序来处理,这对于开发和维护来说都会带来很大的麻烦。 性能。分别在不同的集合上查询要比在一个集合中查询不同数据快得多 数据更集中。同种类型的文档放在一个集合里,数据更加集中,查询数据时,需要的磁盘寻道操作更少,效率更高。 更高效的利用索引。索引是按照集合来定义的。创建索引时,需要使用文档的附加结构。在一个集合中只放入一种类型的文档,可以更有效的对集合进行索引。 数据库

多个文档构成集合,多个集合构成数据库。一个MongoDB实例可以承载多个数据库,每个数据库可以0到多个集合。

不同的数据库使用不同的文件存储数据,使用单独的权限控制。 数据库名字不能包含空字符串、空格、 . , \ , / , \0 , | 数据库名字应该小写,不超过64字节。 不能系统数据库的保留字(admin, local, config) 数据类型

MongoDB的文件存储格式为BSON, 同JSON一样支持往其他文档对象和数组中再插入文档对象和数组,同时拓展了JSON的数据类型。

支持的类型

Type Number Alias Double 1 “double” String 2 “string” Object 3 “object” Array 4 “array” Binary data 5 “binData” Undefined 6 “undefined” ObjectId 7 “objectId” Boolean 8 “bool” Date 9 “date” Null 10 “null” Regular Expression 11 “regex” DBPointer 12 “dbPointer” javascript 13 “javascript” Symbol 14 “symbol” JavaScript (with scope) 15 “javascriptWithScope” 32-bit integer 16 “int” Timestamp 17 “timestamp” 64-bit integer 18 “long” Min key -1 “minKey” Max key 127 “maxKey” CRUD操作 创建操作

创建或插入操作,即向集合添加新的文档,如果插入时集合不存在,插入操作会创建该集合。MongoDB中所有的写操作在单个文档层级上是原子性的。

MongoDB提供了以下方法来插入一个文档到集合:

db.collection.insert() db.collection.insertOne() # 3.2版本 db.collection.insertMany() # 3.2版本

示例:

db.collection.insert(): 向集合中插入一个文档或多文档, 如果插入单文档,只需传入一个文档向函数,如果插入多个文档,则传入一个文档数组 插入单个文档

> use demodb switched to db demodb > db.users.insert({name: "yann", age: 20, status: "p"}) WriteResult({ "nInserted" : 1 })

插入成功则返回一个WriteResult对象,并包含一个nInserted字段,表示成功插入的的文档数目。 MongoDB 还会向文档添加一个 _id 字段, 字段值为一个ObjectId, 当然这个 _id 值是唯一的。如下:

{ "_id" : ObjectId("57f60c8b4be8ad428ccdeeb8"), "name" : "yann", "age" : 20, "status" : "p" }

如果插入失败,WriteResult对象则会包含错误信息。

批量插入 > db.user.insert([{name: "foo", age:1, status: "p"}, {name: "bar", age:2, status: "p"}])

批量插入操作,同样的,如果文档没有提供一个 _id 字段,则MongoDB会替你添加进去。

该操作返回了一个BulkWriteResult对象,成功的BulkWriteResult对象应该是这样的

BulkWriteResult({ "writeErrors" : [ ], "writeConcernErrors" : [ ], "nInserted" : 2, "nUpserted" : 0, "nMatched" : 0, "nModified" : 0, "nRemoved" : 0, "upserted" : [ ] }) 更新操作

更新操作修改集合中存在的文档,MongoDB提供了以下方法来更新集合中的文档

db.collection.update() db.collection.updateOne() db.collection.updateMany() # 3.2版本 db.collection.replaceOne() # 3.2版本

本文数据库(综合)相关术语:系统安全软件

分页:12
转载请注明
本文标题:MongoDB 入门指南
本站链接:http://www.codesec.net/view/481787.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 数据库(综合) | 评论(0) | 阅读(33)