文档

概述

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

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

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

说明

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

 {"recommend":"5"}
{"recommend":5} {"Recommend":"5"}
{"recommend":"5"}

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

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

操作

创建

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

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

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

删除

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

集合

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

动态模式

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

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

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

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

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

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

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

常用命令

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

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

     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到多个集合。下图所示是我的机器上用到的数据库的本地文件:

说明

  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实例中存在的数据库,展示数据库名称列表和数据库占用的磁盘空间大小。如下图所示:

  2. db 检验当前正在使用哪个数据库。如下图所示:

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

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

参考资料:

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

《MongoDB权威指南》(第二版)

MongoDB文档、集合、数据库简介的更多相关文章

  1. MongoDB,无模式文档型数据库简介

    MongoDB的名字源自一个形容词humongous(巨大无比的),在向上扩展和快速处理大数据量方面,它会损失一些精度,在旧金山举行的MondoDB大会上,Merriman说:“你不适宜用它来处理复杂 ...

  2. MongoDB系列一:MongoDB文档型数据库特点介绍

    一.MongoDB数据库的存储特点: 1.MongoDB是文档型数据库,存储的是文档(将json二进制化为Bson存储): 2.存储的每篇文档都可以有自己独特的存储结构,颠覆了传统数据库必须按照表和列 ...

  3. mongoDB文档操作

    数据库操作无非就是增.删.改.查.这篇主要介绍增.删.改. 1.增 Mongodb插入操作很简单,使用关键字“insert”.实例: > db.test.blog.insert({"h ...

  4. MongoDB文档的基本操作

    1. MongoDB的安装方法 (1)下载MongoDB 相应的版本: (2)设置数据文件和日志文件的存放目录: (3)启动MongoDB服务: (4)将MongoDB作为服务启动. 2. Mongo ...

  5. mongodb文档的CRUD

    本章会介绍对数据库移入或者移出数据的基本操作 向集合添加文档 从集合删除文档 更新现有的文档 为这些操作选择合适的安全级别 添加删除数据库 添加数据库 :use foo  如果存在foo 就use   ...

  6. MySQL新特性文档型数据库

    mongodb在文档型数据库这方面一直做的很好,也发展了很多年,MySQL作为一个比较大众的数据库也慢慢支持了该特性,下面介绍一下MySQL支持文档型数据库的简单操作. 环境: 主机名 IP 系统 软 ...

  7. MongoDB 文档的查询和插入操作

    MongoDB是文档型数据库,有一些专门的术语,和关系型DB相似,但也有差异,例如,Collection类似于关系型DB的Table,document类似于row,key/value pair类似于c ...

  8. SmartWiki文档在线管理系统简介

    简介 SmartWiki是一款针对IT团队开发的简单好用的文档管理系统.可以用来储存日常接口文档,数据库字典,手册说明等文档.内置项目管理,用户管理,权限管理等功能,能够满足大部分中小团队的文档管理需 ...

  9. mongoDB 文档概念

    mongoDB 文档概念 什么是文档 文档是 mongodb 基本的数据组织单元,类似于mysql 中的记录 文档由多个键值对组成,每个键值对表达一个数据项 属于 bson 数据 ps:  bson ...

  10. mongoDB 文档操作_查

    基本查询命令 find 查找复合条件的所有文档 命令 db.collection.find(query,field) 参数 query 查找条件 格式: {ssss:"xxx"}是 ...

随机推荐

  1. HTML Meta标签

    Meta标签用于存储web页面上的信息.本质上讲,它是信息数据.他帮助浏览器和搜索引擎更好地知道.理解页面内容. Web开发者,通过Mata标签设置页面描述.作者或关键字等等.然而,许多meta标签功 ...

  2. Android控件之SlidingDrawer(滑动式抽屉)详解与实例

    SlidingDrawer效果想必大家也见到过,它就是1.5模拟器上进入应用程序列表的效果.下面是截图 一.简介 SlidingDrawer隐藏屏外的内容,并允许用户通过handle以显示隐藏内容.它 ...

  3. Silverlight管理系统源代码(SilverlightOAFlame开发框架主要提供二次开发)

    Silverlight OA系统简介 系统功能简介 l 程序界面介绍: 左侧为主菜单,主菜单可以展开和收起,主菜单下面的所有模块都可以在数据库中扩展增加,模块的权限和用户角色挂钩,可以在数据库中创建多 ...

  4. 解决Linux性能问题的前60秒

    为了解决性能问题,你登入了一台Linux服务器,在最开始的一分钟内需要查看什么? 在Netflix我们有一个庞大的EC2 Linux集群,还有非常多的性能分析工具来监控和调查它的性能.其中包括用于云监 ...

  5. FC 坦克大战 老巢铁墙

    老巢外围铁墙E2A9:AC 80 EFEF80:A5 10 85 45 A5 45 AC D2 E2 用十六进制编辑器打开坦克大战的游戏文件搜索A5 45 F0 25 A5 0B改为AC 80 EF ...

  6. codeforces 356 C. Compartments 构造 贪心

    一辆车,有n个车厢,每个车厢刚好有4个人 车上有n个学生,第i个车厢有a[i]个学生 如果一个车厢里面的学生数 <= 2,这个车厢里的学生会不开心 如果一个车厢里面的学生数 > 2,这个车 ...

  7. HTC Vive开发笔记之手柄震动

    手柄震动的代码SteamVR_Controller脚本的最上面的注释里面就有说明,其实也很简单 // Example usage: //这个栗子是左手柄震动 右手震动只需把Leftmost换成Righ ...

  8. 学习C++的第二天

    1.输入 十六进制  cin>>hex>>x>>dec>>y    dec 是十进制    oct 是八进制 输出 十六进制 cout<<h ...

  9. Python第十二章正则表达式

    1.今天学习的f=open("d:\testcase.xml","r")会报错 需要改成f=open("d:\\testcase.xml", ...

  10. Blackfin DSP(六):BF533的SPORT接口

    1.特性 bf533有两个SPORT口(synchronous serial Port),即同步串行接口.完全独立的接收和发送通道,且每个通道都具有缓冲,最高速度可达SCLK/2.最大支持32bit字 ...