阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

MongoDB文档、集合、数据库简介

356次阅读
没有评论

共计 3328 个字符,预计需要花费 9 分钟才能阅读完成。

文档

概述

文档是 MongoDB 的核心概念,是数据的基本单元,非常类似于关系数据库中的行。在 MongoDB 中,文档表示为键值对的一个有序集。MongoDB 使用 Javascript shell,文档的表示一般使用 Javascript 里面的对象的样式来标记,如下:

1 {"title":"hello!"}
2 {"title":"hello!","recommend":5}
3 {"title":"hello!","recommend":5,"author":{"firstname":"paul","lastname":"frank"}}

从上面的例子可以看到,文档的值有不同的数据类型,甚至可以是一个完整的内嵌文档(最后一个示例的 author 是有一个完整的文档表示的,文档里面定义了 firstname 和 lastname。当然还可以包含更多其他信息甚至于在内嵌文档中还可以有内嵌文档)。

说明

文档区分大小写和数据类型,所以以下两组文档是不同的:

1 {"recommend":"5"}
2 {"recommend":5}
3 
4 {"Recommend":"5"}
5 {"recommend":"5"}

MongoDB 的文档不能有重复的键。下面的文档是非法的:

1 {"title":"hello!","title":"Mongo"}

操作

创建

创建文档非常简单,通过插入语句就能向数据库中创建一个文档记录。

1 > db.blogs.insert({"title":"hello!"})

如果在执行这条语句之前,数据库和 blogs 集合并没有创建,会分别创建数据库和集合,同时插入文档。

删除

1 > db.blogs.remove()   // 删除集合中所有文档。
2 > db.blogs.remove({"title":"hello!"})   // 删除指定条件的文档,当前语句删除 "title" 为 "hello!" 的文档。

集合

集合是一组文档的集,相当于关系型数据库中的数据表。

动态模式

集合是动态模式的。什么意思呢?具体来说就是一个集合里面的文档可以是各式各样的。举例来说,下面的两种文档完全可以存储在同一个集合里面:

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

可以看出,上面两个文档不仅值得类型不同,连键也完全不一样。这和关系型数据库中一个表中只能存放相同模型的数据结构显得很不一样。但是这也就产生了一个问题:既然一个集合中可以存放任意的文档,那么多个集合的存在还有什么必要性呢?这其实可以和关系型数据表可以对应起来理解,我们可以创建一张表容纳下上面提到的 title 和 recommend 列,但是总有一个列是 NULL 的。这还仅仅是两个列的情况,如果出现无数的列,那么这种情况就非常糟糕了。所以不难想出一个数据库中存在多个集合的原因应该至少有如下几点:

  1. 数据混乱。开发人员要区分每次查询只返回特定类型的文档,或者把这个区分交给处理查询结果的应用程序来处理。这对于开发和维护来说都会带来很大的麻烦。

  2. 性能。分别在不同的集合上查询要比在一个集合中去查询不同数据快得多。

  3. 数据更集中。同种类型的文档放在一个集合里,数据更加集中,查询数据时。需要的磁盘寻道操作更少,效率更高。

  4. 更高效的利用索引。索引是按照集合来定义的。创建索引时,需要使用文档的附加结构。在一个集合中只放入一种类型的文档,可以更有效的对集合进行索引。

常用命令

  1. show collections  查看当前数据库中存在哪些集合,将展示集合的名称列表。如下图所示:

  2. help()  获取集合上的可执行命令的列表。执行语句如下:

    1 db.users.help()
  3. insert(obj) 向集合中插入一个文档。

  4. drop() 删除当前集合,删除之后不可恢复。

  5. dropIndex(index) 删除集合上的索引,参数为空时,删除所有索引(除了_id 上的索引)

  6. ensureIndex(keypattern[,options]) 创建索引

  7. update(query,object[,upsert_bool,multi_bool]) 更新集合中满足条件的文档

  8. find([query,fields]) 根据条件查询满足条件的文档

当然还有很多命令在这里没有列出,但是可以通过 help()命令轻松的查看能在集合上执行的命令。

数据库

多个文档构成集合,多个集合组成数据库。一个 MongoDB 实例可以承载多个数据库,每个数据库可以拥有 0 到多个集合。下图所示是我的机器上用到的数据库的本地文件:

 MongoDB 文档、集合、数据库简介

说明

  1. 每个数据库有相应的数据文件和命名空间文件。文件的前缀是数据库的名称,后缀.ns 表示命名空间文件,后缀以.0、.1 等数字结尾的,表示数据文件。

  2. 数据文件的大小从 64MB 开始(这是在 64 位 Windows Server 2012 上看到的结果,其他环境可能有些差异),新的数据文件比上一个文件大一倍。所以能看到,chen.0 的大小是 64MB,chen.1 的大小是 128MB,chen.2 是 256MB。

  3. 文件使用 MMAP 进行内存映射,会将所有的数据文件映射到内存中,但是只是虚拟内存,只有访问到这块数据时才会交换到物力内存中。

  4. 每个数据文件会被分成一个一个的数据块,块与块之间用双向链表链接。

  5. 在命名空间文件中,保存了每个命名空间的存储信息元数据,包括其大小、块数、第一块的位置、最后一块的位置、被删除的块的链表以及索引信息。

常用命令

  1. show dbs 查看当前 MongoDB 实例中存在的数据库,展示数据库名称列表和数据库占用的磁盘空间大小。如下图所示:
    MongoDB 文档、集合、数据库简介

  2. db 检验当前正在使用哪个数据库。如下图所示:
    MongoDB 文档、集合、数据库简介

  3. use xxx 切换当前使用的数据库。当 use 一个不存在的数据库的时候,不会立刻创建数据库的数据文件和命名空间文件,而是会在第一次向数据库中插入一个文件的时候才去创建对应的数据库。在这一点上,集合也有类似的特性。

  4. db.dropDatabase() 删除当前使用的数据库。在删除当前使用的数据库之后,db 任然指向被删除的那个数据库名称,可以通过 use 切换;如果不切换就做数据插入操作,会重新建立相同名字的一个数据库,但是已经不是原来的数据库了,尽管有相同的名称,也有可能有相同的集合和文档。

参考资料:

https://docs.mongodb.org/manual/

MongoDB 权威指南第 2 版 PDF 完整带书签目录 下载见 http://www.linuxidc.com/Linux/2016-12/138253.htm

更多 MongoDB 相关教程见以下内容

CentOS 编译安装 MongoDB 与 mongoDB 的 php 扩展 http://www.linuxidc.com/Linux/2012-02/53833.htm

CentOS 6 使用 yum 安装 MongoDB 及服务器端配置 http://www.linuxidc.com/Linux/2012-08/68196.htm

Ubuntu 13.04 下安装 MongoDB2.4.3 http://www.linuxidc.com/Linux/2013-05/84227.htm

MongoDB 入门必读(概念与实战并重) http://www.linuxidc.com/Linux/2013-07/87105.htm

Ubunu 14.04 下 MongoDB 的安装指南 http://www.linuxidc.com/Linux/2014-08/105364.htm

《MongoDB 权威指南》(MongoDB: The Definitive Guide)英文文字版[PDF] http://www.linuxidc.com/Linux/2012-07/66735.htm

Nagios 监控 MongoDB 分片集群服务实战 http://www.linuxidc.com/Linux/2014-10/107826.htm

基于 CentOS 6.5 操作系统搭建 MongoDB 服务 http://www.linuxidc.com/Linux/2014-11/108900.htm

MongoDB 的详细介绍:请点这里
MongoDB 的下载地址:请点这里

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-12/138529.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计3328字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19350
评论数
4
阅读量
7901268
文章搜索
热门文章
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
星哥带你玩飞牛NAS-1:安装飞牛NAS

星哥带你玩飞牛NAS-1:安装飞牛NAS

星哥带你玩飞牛 NAS-1:安装飞牛 NAS 前言 在家庭和小型工作室场景中,NAS(Network Atta...
每年0.99刀,拿下你的第一个顶级域名,详细注册使用

每年0.99刀,拿下你的第一个顶级域名,详细注册使用

每年 0.99 刀,拿下你的第一个顶级域名,详细注册使用 前言 作为长期折腾云服务、域名建站的老玩家,星哥一直...
在Windows系统中通过VMware安装苹果macOS15

在Windows系统中通过VMware安装苹果macOS15

在 Windows 系统中通过 VMware 安装苹果 macOS15 许多开发者和爱好者希望在 Window...
自己手撸一个AI智能体—跟创业大佬对话

自己手撸一个AI智能体—跟创业大佬对话

自己手撸一个 AI 智能体 — 跟创业大佬对话 前言 智能体(Agent)已经成为创业者和技术人绕...
从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统

从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统

从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统 大家好,我是星哥。公司的项目文档存了一堆 ...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择

星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择

星哥带你玩飞牛 NAS-12:开源笔记的进化之路,效率玩家的新选择 前言 如何高效管理知识与笔记,已经成为技术...
手把手教你,购买云服务器并且安装宝塔面板

手把手教你,购买云服务器并且安装宝塔面板

手把手教你,购买云服务器并且安装宝塔面板 前言 大家好,我是星哥。星哥发现很多新手刚接触服务器时,都会被“选购...
多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞...
告别Notion焦虑!这款全平台开源加密笔记神器,让你的隐私真正“上锁”

告别Notion焦虑!这款全平台开源加密笔记神器,让你的隐私真正“上锁”

  告别 Notion 焦虑!这款全平台开源加密笔记神器,让你的隐私真正“上锁” 引言 在数字笔记工...
星哥带你玩飞牛NAS硬件03:五盘位+N5105+双网口的成品NAS值得入手吗

星哥带你玩飞牛NAS硬件03:五盘位+N5105+双网口的成品NAS值得入手吗

星哥带你玩飞牛 NAS 硬件 03:五盘位 +N5105+ 双网口的成品 NAS 值得入手吗 前言 大家好,我...