知识点

软件工具

相关文章

更多

最近更新

更多

快速了解MongoDB【基本概念与体系结构】

2020-10-04 10:34|来源: 网络

什么是MongoDB

MongoDB is a general purpose, document-based, distributed database built for modern application developers and for the cloud era.

MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。

 

MongoDB特点

Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有:

1、面向集合存储,易存储对象类型的数据。

2、模式自由。

3、支持动态查询。

4、支持完全索引,包含内部对象。

5、支持查询。

6、支持复制和故障恢复。

7、使用高效的二进制数据存储,包括大型对象(如视频等)。

8、自动处理碎片,以支持云计算层次的扩展性。

9、支持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。

10、文件存储格式为BSON(一种JSON的扩展)。

 

MongoDB体系结构

MongoDB 的逻辑结构是一种层次结构。主要由:文档(document)、集合(collection)、数据库(database)这三部分组成的。逻辑结构是面向用户的,用户使用 MongoDB 开发应用程序使用的就是逻辑结构。

1、MongoDB 的文档(document),相当于关系数据库中的一行记录。

2、多个文档组成一个集合(collection),相当于关系数据库的表。

3、多个集合(collection),逻辑上组织在一起,就是数据库(database)。

4、一个 MongoDB 实例支持多个数据库(database)。

 

文档(document)、集合(collection)、数据库(database)的层次结构如下图:

1559303526465.png

 

MongoDb 关系型数据库Mysql
数据库(databases) 数据库(databases)
集合(collections) 表(table)
文档(document) 行(row)

 

文档 document

文档是MongoDB中数据的基本单元(类似于关系型数据库中的行,但是比行要复杂得多)。多个键及其关联的值有序地放置在一起便是文档。MongoDB的文件存储格式为BSON。

BSON是Binary JSON 的简称,是一个JSON文档对象的二进制编码格式。BSON同JSON一样支持往其它文档对象和数组中再插入文档对象和数组,同时扩展了JSON的数据类型。如:BSON有Date类型和BinDate类型。

BSON有三个特点:轻量性、可遍历性、高效性


文档就可以这样表示:{ "firstName": "egger", "lastName":"wong" }


文档的特征:

1、文档中的键/值对是有序的。

2、文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌人的文档)。

3、MongoDB区分类型和大小写。

4、MongoDB的文档不能有重复的键。

5、文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。

6、键不能含有\0 (空字符)。这个字符用来表示键的结尾。

7、.和$有特别的意义,只有在特定环境下才能使用。

8、以下划线"_"开头的键是保留的(不是严格要求的)。


集合

集合就是一组文档(类似于关系型数据库中的表),可以被看做是没有模式的表。

集合是无模式的。这意味着一个集合里面的文档可以是各式各样的。例如,下面两个文档可以存在于同一个集合里面:

  {"name": "egger"}

  {"age":18}

上面的文档不光是值的类型不同(字符串和整数),它们的键也是完全不一样的。


虽然集合里面可以放置任何文档,但是推荐使用多个集合:

    把各种各样的文档都混在一个集合里面,无论对于开发者还是管理员来说都是噩梦。

    在一个集合里面査询特定类型的文档在速度上也很不划算,分开做多个集合要快得多。

    把同种类型的文档放在一个集合里,这样数据会更加集中。

    当创建索引的时候,文档会有附加的结构(尤其是有唯一索引的时候)。索引是按照集合来定义的。把同种类型的文档放入同一个集合里面,可以使索引更加有效。


命名

我们可以通过名字来标识集合。集合名可以是满足下列条件的任意UTF-8字符串。

1、集合名不能是空字符串""。

2、集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。

3、集合名不能以"system."开头,这是为系统集合保留的前缀。

4、用户创建的集合名字不能含有保留字符$。有些驱动程序的确支持在集合名里面包含$,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。 


子集合

组织集合的一种惯例是使用"."字符分开的按命名空间划分的子集合。在MongoDB中使用子集合来组织数据是很好的方法

例如,一个个人信息可能包含两个集合,分别是person.name和person.age。这样做的目的只是为了使组织结构更好些,也就是说person这个集合(这里根本就不需要存在)及其子集合没有任何关系。把数据库的名字放到集合名前面,得到就是集合的完全限定名,称为命名空间。命名空间的长度不得超过121字节,在实际使用当中应该小于100字节。


很多MongoDB工具中都包含子集合。

    GridFS是一种存储大文件的协议,使用子集合来存储文件的元数据,这样就与内容块分开了

    MongoDB的Web控制台通过子集合的方式将数据组织在DBTOP部分.

    绝大多数驱动程序都提供语法糖,为访问指定集合的子集合提供方便。


数据库

MongoDB中多个集合可以组成数据库。MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。

数据库也通过名字来标识。数据库名可以是满足以下条件的任意UTF-8字符串。

1、不能是空字符串("")。

2、不得含有' '(空格)、.、$、/、\和\0 (空宇符)。

3、应全部小写。

4、最多64字节。

5、有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。

    • admin

    从权限的角度来看,这是“root”数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。

    • local

    这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合

    • config

    当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。


本文整理于网络


相关问答

更多
  • 电脑体系结构?[2022-10-20]

  • ....就是这样
  • 计算机体系结构(ComputerArchitecture)是程序员所看到的计算机的属性,即概念性结构与功能特性。按照计算机系统的多级层次结构,不同级程序员所看到的计算机具有不同的属性。 计算机组成(computer composition)指的是系统结构的逻辑实现,包括机器机内的数据流和控制流的组成及逻辑设计等。
  • Web服务(Web Services)在很多人眼里还是个十分神秘的概念,究其根源,我想主要是由于Web服务被宣传得很多,但实际应用却鲜见,给人一种很复杂和难以理解的感觉。另外,Web服务是基于XML的,不少人对XML本身也缺乏理解,虽然他们可能每天都在写XML格式的配置文件。 提到Web服务的起源就一定要先说一说SOA(面向服务的体系结构),和很多具有划时代意义的软件技术一样,SOA的出现根本上也是为了解决软件危机问题。做过项目的人都有过这种感受,随着项目推进,模块之间关系越来越紧密,任何一个小的修改都可能 ...
  • NodeJS和Python同样适用于基本的图像处理。 在这方面,我会更加关注您的团队的专业知识和/或当前环境,从而确定服务器端语言。 使用Python PIL或Pillow是要使用的主要图像库。 我已经使用https://github.com/aheckmann/gm来进行基本图像处理并不困难的NodeJS。 (和4)在从API中检索图像方面,我典型地使用典型的REST / CRUD来设置元数据,并通过添加... /图像将图像放到更深的一层。 到端点。 例如: GET ../picture/ 将返回 ...
  • 您最好的选择是将您的群组和评论模式嵌入您的文章文档中。 例如, var GroupSchema = Schema({ name: String, created: { type:Date, default: Date.now }, }); var CommentSchema = Schema({ text: String, postedBy: { type: mongoose.Schema.Types.ObjectId, ref: 'Use ...