MongoDB的文档、集合、数据库(二)
为了理解MongoDB的名词,可以将其于关系型数据库进行对比:
一、文档
概述
文档是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的文档中的键值对是有序的,下面的文档是不同的:
- {"title1":"hello!","title2":"Mongo"}
- {"title2":"Mongo","title1":"hello!"}
MongoDB的文档不能有重复的键。下面的文档是非法的:
- {"title":"hello!","title":"Mongo"}
文档中的值不仅可以是字符串,也可以是其他数据类型(或者嵌入其他文档)
键是字符串,键可以使用任意UTF-8字符
键不能含有\0(空字符),空字符表示键的结尾
和$作为保留字符,通常不应该出现在键中
以下划线“_”开头的键通常情况下是保留的
- > 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.不能含有空字符\0
3.不能以“system.”开头,这是系统集合保留的前缀
4.集合名不能含保留字符$
组织集合的一种习惯是以. 分开,近命名空间划分子集合,列如system.Users,system.indexes
常用命令
show collections 查看当前数据库中存在哪些集合,将展示集合的名称列表。如下图所示:
show collections 查看当前数据库中存在哪些集合,将展示集合的名称列表。如下图所示:
help() 获取集合上的可执行命令的列表。执行语句如下:
- db.users.help()
insert(obj) 向集合中插入一个文档。
drop() 删除当前集合,删除之后不可恢复。
dropIndex(index) 删除集合上的索引,参数为空时,删除所有索引(除了_id上的索引)
ensureIndex(keypattern[,options]) 创建索引
update(query,object[,upsert_bool,multi_bool]) 更新集合中满足条件的文档
find([query,fields]) 根据条件查询满足条件的文档
当然还有很多命令在这里没有列出,但是可以通过help()命令轻松的查看能在集合上执行的命令。
三、数据库
多个文档构成集合,多个集合组成数据库。一个MongoDB实例可以承载多个数据库,每个数据库可以拥有0到多个集合。下图所示是我的机器上用到的数据库的本地文件:
说明
每个数据库有相应的数据文件和命名空间文件。文件的前缀是数据库的名称,后缀.ns表示命名空间文件,后缀以.0、.1等数字结尾的,表示数据文件。
数据文件的大小从64MB开始(这是在64位Windows Server 2012上看到的结果,其他环境可能有些差异),新的数据文件比上一个文件大一倍。所以能看到,chen.0的大小是64MB,chen.1的大小是128MB,chen.2是256MB。
文件使用MAP进行内存映射,会将所有的数据文件映射到内存中,但是只是虚拟内存,只有访问到这块数据时才会交换到物力内存中。
每个数据文件会被分成一个一个的数据块,块与块之间用双向链表链接。
在命名空间文件中,保存了每个命名空间的存储信息元数据,包括其大小、块数、第一块的位置、最后一块的位置、被删除的块的链表以及索引信息。
命名规则
- 数据库名是utf-8字符串,最长64个字符
- 不能是空字符串
- 不能含"、/、\、.、*、<、>、:、|、?、$、(一个空格)、\0(空字符),基本上只能用ASCII中的字母和数字。
- 数据库名区分大小写,即使在不区分大小写的文件系统也是如此,简单起见:应全部小写。
常用命令
show dbs 查看当前MongoDB实例中存在的数据库,展示数据库名称列表和数据库占用的磁盘空间大小。如下图所示:
2.db 检验当前正在使用哪个数据库。如下图所示:
3.use xxx 切换当前使用的数据库。当use一个不存在的数据库的时候,不会立刻创建数据库的数据文件和命名空间文件,而是会在第一次向数据库中插入一个文件的时候才去创建对应的数据库。在这一点上,集合也有类似的特性。
4.db.dropDatabase() 删除当前使用的数据库。在删除当前使用的数据库之后,db任然指向被删除的那个数据库名称,可以通过use切换;如果不切换就做数据插入操作,会重新建立相同名字的一个数据库,但是已经不是原来的数据库了,尽管有相同的名称,也有可能有相同的集合和文档。
系统保留数据库
- admin:这是root数据库,添加用户到该数据库中,该用户会自动继承所有数据库权限
- local:这个数据库中的数据永远不会被复制,可以用于存储限于本地数据单台服务器的任意集合
- config:分片时,config数据库在内部使用,保存分片信息
把数据库名放集合名钱,得到的就是集合的完全限定名称,叫命名空间。命名空间长度不能超过121字节,实际使用应小于100字节。
MongoDB的文档、集合、数据库(二)的更多相关文章
- MongoDB小型文档型数据库使用
MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中 ...
- MongoDB系列一:MongoDB文档型数据库特点介绍
一.MongoDB数据库的存储特点: 1.MongoDB是文档型数据库,存储的是文档(将json二进制化为Bson存储): 2.存储的每篇文档都可以有自己独特的存储结构,颠覆了传统数据库必须按照表和列 ...
- MySQL新特性文档型数据库
mongodb在文档型数据库这方面一直做的很好,也发展了很多年,MySQL作为一个比较大众的数据库也慢慢支持了该特性,下面介绍一下MySQL支持文档型数据库的简单操作. 环境: 主机名 IP 系统 软 ...
- MongoDB,无模式文档型数据库简介
MongoDB的名字源自一个形容词humongous(巨大无比的),在向上扩展和快速处理大数据量方面,它会损失一些精度,在旧金山举行的MondoDB大会上,Merriman说:“你不适宜用它来处理复杂 ...
- mongodb查询文档
说到查询,我们一般就想起了关系型数据库的查询了,比如:order by(排序).limit(分页).范围查询(大于某个值,小于某个值..,in查询,on查询,like查询等待很多),同样mongodb ...
- Python MongoDB 插入文档
章节 Python MySQL 入门 Python MySQL 创建数据库 Python MySQL 创建表 Python MySQL 插入表 Python MySQL Select Python M ...
- Mongodb嵌套文档的改动-利用数组改动器更新数据
初学mongodb的可能和我一样有个疑问.mongodb是文档型的,那么假设一个文档嵌套另外一个文档,假设对这个嵌套文档进行增删改查呢. 就像例如以下这样:.怎样对auther里面的name进行增删改 ...
- 在Delphi中处理word文档与数据库的互联 1
在Delphi中处理word文档与数据库的互联 ---- 目前,Delphi被越来越多的人选中作为MIS系统开发中的前台工具.在以Delphi为前台,一些大型数据库为后台的MIS系统中,图形的处理不可 ...
- 在Delphi中处理word文档与数据库的互联
在Delphi中处理word文档与数据库的互联 ---- 目前,Delphi被越来越多的人选中作为MIS系统开发中的前台工具.在以Delphi为前台,一些大型数据库为后台的MIS系统中,图形的处理不可 ...
随机推荐
- 【转】SQL模糊查询
在进行数据库查询时,有完整查询和模糊查询之分. 一般模糊查询语句如下: SELECT 字段 FROM 表 WHERE 某字段 Like 条件 其中关于条件,SQL提供了四种匹配模式: 1,% :表示任 ...
- ElasticSearch 索引模块——全文检索
curl -XPOST http://master:9200/djt/user/3/_update -d '{"doc":{"name":"我们是中国 ...
- [Python] Hermite 插值
# -*- coding: utf-8 -*- #Program 0.5 Hermite Interpolation import matplotlib.pyplot as plt import nu ...
- 1.line (线)
1.横线 HTML代码: 横线(水平线) <hr/> <div class="row"> 横线(盒子上边框线) </div> CSS代码: .r ...
- 7.css实现三角形
1.效果: 2.代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...
- leetcode459
public class Solution { public bool RepeatedSubstringPattern(string s) { var len = s.Length; ) { ret ...
- padding 扩大边距 margin-top 与页面顶部的距离 hover鼠标移动到上面出现背景色CSS
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Java System.getProperty("java.io.tmpdir") 获取系统临时目录
System.getProperty("java.io.tmpdir") 是获取操作系统的缓存临时目录 在windows7中的目录是: C:\Users\登录用户~1\AppDat ...
- ABAP-SMARTFORMS
- ABAP-关于COMMIT WORK 和COMMIT WORK AND WAIT
转载:https://blog.csdn.net/champaignwolf/article/details/6925019 首先说明一点:更新是异步的,更新是由SAP中UPD1和UPD2两个进程执行 ...