组件结构

核心进程

在 MongoDB 中,核心进程主要包含了 mongod、mongos 和 mongosh 三个。

其中最主要的是 mongod 程序,其在不同的部署方案中(单机部署、副本集部署、分片集群部署),通过不同的配置,可以扮演多种不同的角色:

  • 在单机部署中作为数据库服务器(提供所有读写功能)
  • 在副本集部署中,通过配置,可以部署为 Primary 节点(负责写数据,也可以提供查询)、Secondary 节点(从主节点复制数据,也可以提供查询)、以及 Arbiter 节点(不保存数据,主要用于参与选举投票)
  • 在分片集群中,除了在每个分片中扮演上述角色外,还扮演着配置服务器的角色(存储有分片集群的所有元数据信息,mongos 的数据路由分发等都要依赖于它)

在一台服务器上,可以启动多个 mongod 服务。但在实际生产部署中,通常是建议一台服务器部署一个 mongod 实例,这样不仅减少资源竞争,而且服务器故障也不会同时影响到多个服务。

mongos 在分片集群中扮演路由的角色,提供客户端和分片之间的接口。

mongosh 是 MongoDB 集成的交互式 shell 工具。

数据库工具

MongoDB 数据库工具是用于处理 MongoDB 部署的命令行实用程序的集合。数据库工具包括以下二进制文件:

  • 二进制导入导出

    • mongodump: 导出 mongod 数据库的二进制数据
    • mongorestore: 恢复 mongodump 导出文件的数据到 mongod 或 mongos 数据库
    • bsondump: 转换 BSON 导出文件成 JSON 格式
  • 数据导入导出
    • mongoimport: 从外部 JSON、CSV 或 TSV 文件中加载数据
    • mongoexport: 从 mongod 实例中导出数据到 JSON 或 CSV 文件中
  • 诊断工具
    • mongostat: 快速诊断当前运行的 mongod 或 mongos 实例的状态
    • mongotop: 统计 mongod 实例读取和写入数据的时间
  • GridFS 工具
    • mongofiles: 支持在 GridFS 对象中操作 MongoDB 实例中存储的文件

数据逻辑结构

MongoDB 数据逻辑结构分为数据库 database、集合 collection、文档 document 三层 :

  • 一个 mongod 实例中允许创建多个数据库
  • 一个数据库中允许创建多个集合,集合相当于关系型数据库的表
  • 一个集合则是由若干个文档构成,文档相当于关系型数据库的行,是 MongoDB 中数据的基本单元

数据库

一个数据库中可以创建多个集合,原则上应把逻辑相近的集合都放在一个数据库中。

在 MongoDB 中,会有以下几个内建的数据库:

  • admin: 存放有数据库帐号相关信息,在身份验证和授权时使用
  • local: 特定于单个服务器的数据会存储在此数据库中。在副本集中,local 数据库用于存储复制过程中所使用的数据,而其本身不会被复制。
  • config: 用于分片集群环境,存放了分片相关的元数据信息
  • test: 默认创建的测试库,连接 mongod 服务时,如果不指定连接的具体数据库,默认就会连接到 test 数据库

集合

和 SQL 的表不同,集合是动态模式,不需要在读写数据前创建模式就可以使用,集合中的文档也可以拥有不同的字段,随时可以任意增减某个文档的字段。

默认情况下,集合不要求其文档具有相同的模式,但这是一种很好的实践。可以通过使用 MongoDB 的文档验证功能和可用于多种编程语言的对象–文档映射(object-document mapping)库来实现文档验证。

集合由其名称进行标识,集合名称可以是任意 UTF-8 字符串,但有以下限制:

  • 不能是空字符串("")。
  • 不能含有 \0(空字符),这个字符用于表示集合名称的结束
  • 不能以 system. 开头,该前缀为内部集合保留

集合名称使用 . 字符可以创建子集合,用与区分不同组织集合。虽然子集合没有任何特殊属性,但它们很有用,许多 MongoDB 工具整合了子集合。

文档

文档是 MongoDB 中数据的基本存储单元,以一种叫作 BSON 的文档结构表示。

文档中的键值对是有序的,不同序则是不同文档。并且键是区分大小写的,否则也为不同文档。

文档的键是字符串,而值除了字符串,还可以是 IntLongDoubleBoolean、数组、嵌入文档等多种类型。

每个文档都有一个默认的 _id 键,它相当于关系型数据库中的主键,这个键的值在同一个集合中必须是唯一的。

_id 键的值默认是 ObjectId 类型,在插入文档的时候,如果用户不设置文档的 _id 值的话,MongoDB 会自动生成一个唯一的 ObjectId 值进行填充。

数据库文件

MongoDB 在 3.2 版本已经将 WiredTiger 作为默认的存储引擎。其作为存储引擎的时候,数据库会有以下存储文件:

  • collection-*.wt: 存储集合的数据
  • index-*.wt: 存储索引的数据
  • WiredTiger: 存储基本配置信息
  • WiredTiger.wt: 存储所有其他集合的元数据信息
  • WiredTiger.lock: 存储进程 ID,用于防止多个进程连接同一个 WiredTiger 数据库
  • WiredTiger.turtle: 存储 WiredTiger.wt 的元数据信息
  • journal: 存储数据库的写日志

命令行工具

MongoDB 提供的 mongosh 是一个 JavaScript 的 shell,其提供了许多高级功能和自定义功能。

使用技巧

对于 MongoDB 提供的功能,shell 内置了帮助文档,可以输入 help 命令进行访问,使用 db.help() 可以查看数据库级别的帮助文档,使用 db.foo.help() 可以查看集合级别的帮助文档。

在 shell 中使用函数之前,在不使用括号的情况下输入函数名,这样会打印出函数的源代码,这是一个可以查看函数具体行为的好方法。

执行脚本

shell 不止可以直接执行 JavaScript 的脚本代码,还可以用于执行 JavaScript 的脚本文件,简单执行 mongo script.js 即可。

如果已经进入到 shell 中,可以使用 load() 函数加载 JavaScript 脚本文件。

创建 .mongorc.js 文件

对于需要频繁被加载的脚本,可以将它们添加到 .mongorc.js 中,此文件会在启动 shell 时自动运行。

在更实际一些的场景中,使用此脚本可以设置全局变量,或者为长名称设置一个简短的别名,也可以重写内置函数。

定制提示信息

通过将 prompt 变量设置为一个字符串或函数,可以重写默认的 shell 提示,如下示例:

prompt = function() {
if (typeof db == 'undefined') {
return '(nodb)> ';
} // 检查最后的数据库操作
try {
db.runCommand({getLastError: 1});
} catch (e) {
print(e);
} return db+"> ";
};

提示函数应该返回一个字符串,通常应该包含对 getLastError 的调用,这样可以捕获输入时的错误,并在 shell 断开连接时自动重新连接。

编辑复杂变量

使用 shell 时,编辑多行的时候不能再编辑前面的行,这对于较大的代码块或对象非常不友好。

为此,可以在 shell 中设置 EDITOR 变量,则可以使用 edit varname 的方式编辑一个变量,完成更改后只需保存并退出编辑器,变量将被重新解析并加载回 shell 中。

不便使用的集合名称

大多数情况下可以使用 db.collectionName 语法来获得一个集合的内容,但如果集合名称是保留字或是无效的 JavaScript 属性名称时,那么此方法就不能正常工作了。

对于上述的情况,可以使用 db.getCollection() 的方式绕过无效属性。

MongoDB - 入门指南的更多相关文章

  1. mongoDB 入门指南、示例

    一.准备工作 1. 下载mongoDB 下载地址:http://www.mongodb.org/downloads 选择合适你的版本 相关文档:http://www.mongodb.org/displ ...

  2. MongoDB快速入门指南与docker-compose快体验

    MongoDB快速入门指南与docker-compose快体验 MongoDB相对于RDBMS的优势 模式少 -MongoDB是一个文档数据库,其中一个集合包含不同的文档.一个文档之间的字段数,内容和 ...

  3. Nodejs学习笔记(十)--- 与MongoDB的交互(mongodb/node-mongodb-native)、MongoDB入门

    目录 简介 MongoDB安装(windows) MongoDB基本语法和操作入门(mongo.exe客户端操作) 库操作 插入 查询 修改 删除 存储过程 nodejs操作MongoDB 插入 查询 ...

  4. dogse入门指南

    dogse入门指南 Dogse作为游戏服务端引擎,目前只包含游戏服务端的核心部分,但这也是最核心的部分.它全部使用.net c#开发,充分兼顾了程序性能与代码编写的准确性与易用性,再加上以vs作为开发 ...

  5. Nodejs学习笔记(十)—与MongoDB的交互(mongodb/node-mongodb-native)、MongoDB入门

    简介 MongoDB 开源,高性能的NoSQL数据库:支持索引.集群.复制和故障转移.各种语言的驱动程序:高伸缩性: NoSQL毕竟还处于发展阶段,也有说它的各种问题的:http://coolshel ...

  6. Web API 入门指南 - 闲话安全

    Web API入门指南有些朋友回复问了些安全方面的问题,安全方面可以写的东西实在太多了,这里尽量围绕着Web API的安全性来展开,介绍一些安全的基本概念,常见安全隐患.相关的防御技巧以及Web AP ...

  7. Vue.js 入门指南之“前传”(含sublime text 3 配置)

    题记:关注Vue.js 很久了,但就是没有动手写过一行代码,今天准备入手,却发现自己比菜鸟还菜,于是四方寻找大牛指点,才终于找到了入门的“入门”,就算是“入门指南”的“前传”吧.此文献给跟我一样“白痴 ...

  8. yii2实战教程之新手入门指南-简单博客管理系统

    作者:白狼 出处:http://www.manks.top/document/easy_blog_manage_system.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文 ...

  9. 【翻译】Fluent NHibernate介绍和入门指南

    英文原文地址:https://github.com/jagregory/fluent-nhibernate/wiki/Getting-started 翻译原文地址:http://www.cnblogs ...

随机推荐

  1. 【Java】学习路径59-多个连接的服务器端

    ServerSocket可以对接多个Socket对象,利用这点,就可以实现:一台服务器对多个客户端. import java.io.IOException; import java.net.*; pu ...

  2. 【java】学习路线6-静态方法、私有化方法、父类子类

    import java.util.Arrays; /* 我们可以自己创建方法(静态) 私有化方法,阻止他人实例化该方法 静态代码块只执行一次,只在加载这个所在类的时候执行 父类 - 子类 子类继承自父 ...

  3. Laravel框架中文件所在的位置

  4. 窗口部件-基础窗口部件 QWidget

    1 基础窗口部件 QWidget QWidget 类是所有用户界面对象的基类,被称为基础窗口部件.不多废话直接看代码 main.cpp 如下 #include<QtWidgets> int ...

  5. 第六篇:vue.js模板语法(,属性,指令,参数)

    Vue.js 的核心是一个允许你采用简洁的模板语法来声明式的将数据渲染进 DOM 的系统. 结合响应系统,在应用状态改变时, Vue 能够智能地计算出重新渲染组件的最小代价并应用到 DOM 操作上.( ...

  6. VS Code中Markdown常用插件

    目录 目录 1.Markdown All in One 2.Markdown Preview Enhanced 3.markdownlint 1.Markdown All in One 自动生成目录 ...

  7. DOS文档

  8. Pytest测试框架一键动态切换环境思路及方案

    前言 在上一篇文章<Pytest fixture及conftest详解>中,我们介绍了fixture的一些关键特性.用法.作用域.参数等,本篇文章将结合fixture及conftest实现 ...

  9. Beats:运用 Filebeat 来对微服务 API 进行分析

    文章转载自:https://elasticstack.blog.csdn.net/article/details/118145104 需要学习的是httpjson请求的写法 使用 Filebeat 的 ...

  10. 5.使用nexus3配置npm私有仓库

    当我们运行前端项目的时候,常常在解决依赖的时候会加上一个参数npm install --registry=https://registry.npm.taobao.org将源指定为淘宝的源,以期让速度加 ...