MongoDB 是由 C++语言编写的,是一个基于分布式文件存储的开源数据库系统。 再高负载的状况下,添加更多的节点,能够保证服务器性能。 MongoDB 旨在给 WEB 应用提供可扩展的高性能数据存储解决方案。javascript
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。 MongoDB 文档相似于 JSON 对象。字段值能够包含其余文档,数组及文档数组。java
(1)MongoDB 是一个面向文档存储的数据库,操做起来比较简单和容易。c++
(2)你能够在 MongoDB 记录中设置任何属性的索引 (如: FirstName="Sameer",Address="8 Gandhi Road")来实现更快的排序。程序员
(3)你能够经过本地或者网络建立数据镜像,这使得 MongoDB 有更强的扩展性。面试
(4)若是负载的增长(须要更多的存储空间和更强的处理能力) ,它能够分布在计算机网络中的其余节点上这就是所谓的分片。正则表达式
(5)Mongo 支持丰富的查询表达式。查询指令使用 JSON 形式的标记,可轻易查询文档中内嵌的对象及数组。mongodb
(6)MongoDb 使用 update()命令能够实现替换完成的文档(数据)或者一些指定的数据字段 。数据库
(7)Mongodb 中的 Map/reduce 主要是用来对数据进行批量处理和聚合操做。编程
(8)Map 和 Reduce。 Map 函数调用 emit(key,value)遍历集合中全部的记录,将 key 与 value 传给 Reduce 函数进行处理。json
(9)Map 函数和 Reduce 函数是使用 Javascript 编写的,并能够经过 db.runCommand 或 mapreduce 命令来执行 MapReduce 操做。
(10)GridFS 是 MongoDB 中的一个内置功能,能够用于存放大量小文件。
(11) MongoDB 容许在服务端执行脚本, 能够用 Javascript 编写某个函数,直接在服务端执行,也能够把函数的定义存储在服务端,下次直接调用便可。
NoSQL是非关系型数据库,NoSQL = Not Only SQL。
关系型数据库采用的结构化的数据,NoSQL采用的是键值对的方式存储数据。
在处理非结构化/半结构化的大数据时;在水平方向上进行扩展时;随时应对动态增长的数据项时能够优先考虑使用NoSQL数据库。
再考虑数据库的成熟度;支持;分析和商业智能;管理及专业性等问题时,应优先考虑关系型数据库。
NoSQL数据库的类型
例如:MongoDB, Cassandra, CouchDB, Hypertable, Redis, Riak, HBASE, Memcache
MySQL和MongoDB二者都是免费开源的数据库。MySQL和MongoDB有许多基本差异包括数据的表示(data representation),查询,关系,事务,schema的设计和定义,标准化(normalization),速度和性能。
经过比较MySQL和MongoDB,实际上咱们是在比较关系型和非关系型数据库,即数据存储结构不一样。
MongoDB和CouchDB都是面向文档的数据库。MongoDB和CouchDB都是开源NoSQL数据库的最典型表明。 除了都以文档形式存储外它
们没有其余的共同点。MongoDB和CouchDB在数据模型实现、接口、对象存储以及复制方法等方面有不少不一样。
如下特色使得MongoDB成为最好的NoSQL数据库:
每一个journal (group)的写操做都是一致的,除非它是完整的不然在恢复过程当中它不会回放。
MongoDB中包括了一个能够显示数据库中每一个操做性能特色的数据库分析器。经过这个分析器你能够找到比预期慢的查询(或写操做);利用这一信息,好比,能够肯定是否须要添加索引。
MongoDB存储BSON对象在丛集(collection)中。数据库名字和丛集名字以句点连结起来叫作名字空间(namespace)。
是的,用户移除属性而后对象会从新保存(re-save())。
是的。
对于对象成员而言,是的。然而用户不可以添加空值(null)到数据库丛集(collection)由于空值不是对象。然而用户可以添加空对象{}。
不会,磁盘写操做默认是延迟执行的。写操做可能在两三秒(默认在60秒内)后到达磁盘。例如,若是一秒内数据库收到一千个对一个对象递增的操做,仅刷新磁盘一次。(注意,尽管fsync选项在命令行和通过getLastError_old是有效的)
MongoDB没有使用传统的锁或者复杂的带回滚的事务,由于它设计的宗旨是轻量,快速以及可预计的高性能。能够把它类比成MySQLMylSAM的自动提交模式。经过精简对事务的支持,性能获得了提高,特别是在一个可能会穿过多个服务器的系统里。
MongoDB会积极的预分配预留空间来防止文件系统碎片。
从备份数据库声明主数据库宕机到选出一个备份数据库做为新的主数据库将花费10到30秒时间。这期间在主数据库上的操做将会失败--包括
写入和强一致性读取(strong consistent read)操做。然而,你还能在第二数据库上执行最终一致性查询(eventually consistent query)(在slaveOk模式下),即便在这段时间里。
它是当前备份集群(replica set)中负责处理全部写入操做的主要节点/成员。在一个备份集群中,当失效备援(failover)事件发生时,一个另外的成员会变成primary。
Seconday从当前的primary上复制相应的操做。它是经过跟踪复制oplog(local.oplog.rs)作到的。
不用。无论你有没有调用getLastError(又叫"Safe Mode")服务器作的操做都同样。调用getLastError只是为了确认写操做成功提交了。固然,你常常想获得确认,可是写操做的安全性和是否生效不是由这个决定的。
为开发便捷起见,咱们建议以非集群分片(unsharded)方式开始一个 MongoDB 环境,除非一台服务器不足以存放你的初始数据集。从非集群分片升级到集群分片(sharding)是无缝的,因此在你的数据集还不是很大的时候不必考虑集群分片(sharding)。
每个分片(shard)是一个分区数据的逻辑集合。分片可能由单一服务器或者集群组成,咱们推荐为每个分片(shard)使用集群。
MongoDB 分片是基于区域(range)的。因此一个集合(collection)中的全部的对象都被存放到一个块(chunk)中。只有当存在多余一个块的时后,才会有多个分片获取数据的选项。如今,每一个默认块的大小是 64Mb,因此你须要至少 64 Mb 空间才能够实施一个迁移。
更新操做会当即发生在旧的分片(shard)上,而后更改才会在全部权转移(ownership transfers)前复制到新的分片上。
若是一个分片(shard)中止了,除非查询设置了“Partial”选项,不然查询会返回一个错误。若是一个分片(shard)响应很慢,MongoDB则会等待它的响应。
没问题,这些文件是在分片(shard)进行均衡操做(balancing)的时候产生的临时文件。一旦这些操做已经完成,相关的临时文件也应该被删除掉。但目前清理工做是须要手动的,因此请当心地考虑再释放这些文件的空间。
db._adminCommand("connPoolStats");
不须要,移动操做是一致(consistent)而且是肯定性的(deterministic);一次失败后,移动操做会不断重试;当完成后,数据只会出如今新的分片里(shard)。
能够。
更新操做会当即发生在旧的块(Chunk)上,而后更改才会在全部权转移前复制到新的分片上。
不会,只会在A:{B,C}上使用索引。
若是一个分片中止了,除非查询设置了“Partial”选项,不然查询会返回一个错误。若是一个分片响应很慢,MongoDB会等待它的响应。
MongoDB支持存储过程,它是javascript写的,保存在db.system.js表中。
GridFS是一种将大型文件存储在MongoDB中的文件规范。使用GridFS能够将大文件分隔成多个小文档存放,这样咱们可以有效的保存大文档,并且解决了BSON对象有限制的问题。
NoSQL是非关系型数据库,NoSQL = Not Only SQL。
关系型数据库采用的结构化的数据,NoSQL采用的是键值对的方式存储数据。
在处理非结构化/半结构化的大数据时;在水平方向上进行扩展时;随时应对动态增长的数据项时能够优先考虑使用NoSQL数据库。
在考虑数据库的成熟度;支持;分析和商业智能;管理及专业性等问题时,应优先考虑关系型数据库。
MongoDB支持存储过程,它是javascript写的,保存在db.system.js表中。
GridFS是一种将大型文件存储在MongoDB中的文件规范。使用GridFS能够将大文件分隔成多个小文档存放,这样咱们可以有效的保存大文档,并且解决了BSON对象有限制的问题。
MongoDB采用的预分配空间的方式来防止文件碎片。
更新操做会当即发生在旧的块(Chunk)上,而后更改才会在全部权转移前复制到新的分片上。
不会,只会在A:{B,C}上使用索引。
若是一个分片中止了,除非查询设置了“Partial”选项,不然查询会返回一个错误。若是一个分片响应很慢,MongoDB会等待它的响应。
分析器就是explain 显示每次操做性能特色的数据库分析器。经过分析器可能查找比预期慢的操做
是的,用户移除属性而后对象会从新保存(re-save())。
是的
通常磁盘的写操做都是延迟执行的
由于mongodb设计就是轻量高性能,因此没有传统的锁和复杂的事务的回滚
当前备份集群负责全部的写入操做的主要节点,在集群中,当主节点(master)失效,另外一个成员会变为master
调用getLastError 能够确认当前的写操做是否成功的提交
分片多是单一的服务器或者集群组成,推荐使用集群
mongodb分片是基于区域的,因此一个集合的全部对象都放置在同一个块中,只有当存在多余一个块的时候,才会有多个分片获取数据的选项
会当即更新旧的分片,而后更改才会在全部权转移前复制到新的分片上
db._adminCommand("connPoolStats");复制代码
数据库中存储的对象设计bson,一种相似json的二进制文件,由键值对组成
键值对–》文档–》集合–》数据库
MongoDB用c++编写的,流行的开源数据库MySQL也是用C++开发的。C++1983年发行是一种使用普遍的计算机程序设计语言。它是一种痛用程序设计语言,支持 多种编程模式。
集合就是一组 MongoDB 文档。它至关于关系型数据库(RDBMS)中的表这种概念。集合位于单独的一个数据库中。一个集合内的多个文档能够有多个不一样的字段。通常来讲,集合中的文档都有着相同或相关的目的。
文档由一组key value组成。文档是动态模式,这意味着同一集合里的文档不须要有相同的字段和结构。在关系型数据库中table中的每一条记录至关于MongoDB中的一个文档。
mongod是处理MongoDB系统的主要进程。它处理数据请求,管理数据存储,和执行后台管理操做。当咱们运行mongod命令意味着正在启动MongoDB进程,而且在后台运行。
它是一个命令行工具用于链接一个特定的mongod实例。当咱们没有带参数运行mongo命令它将使用默认的端口号和localhost链接
MongoDB 用 use +数据库名称的方式来建立数据库。 use 会建立一个新的数据库,若是该数据库存在,则返回这个数据库。
非关系型数据库是对不一样于传统关系型数据库的统称。非关系型数据库的显著特色是不使用SQL做为查询语言,数据存储不须要特定的表格模式。因为简单的设计和很是好的性能因此被用于大数据和Web Apps等
MongoDB内部有预分配空间的机制,每一个预分配的文件都用0进行填充。
数据文件每新分配一次,它的大小都是上一个数据文件大小的2倍,每一个数据文件最大2G。
MongoDB每一个集合和每一个索引都对应一个命名空间,这些命名空间的元数据集中在16M的*.ns文件中,平均每一个命名占用约 628 字节,也即整个数据库的命名空间的上限约为24000。
若是每一个集合有一个索引(好比默认的_id索引),那么最多能够建立12000个集合。若是索引数更多,则可建立的集合数就更少了。同时,若是集合数太多,一些操做也会变慢。
要创建更多的集合的话,MongoDB 也是支持的,只须要在启动时加上“--nssize”参数,这样对应数据库的命名空间文件就能够变得更大以便保存更多的命名。这个命名空间文件(.ns文件)最大能够为 2G。
每一个命名空间对应的盘区不必定是连续的。与数据文件增加相同,每一个命名空间对应的盘区大小都是随分配次数不断增加的。目的是为了平衡命名空间浪费的空间与保持一个命名空间数据的连续性。
须要注意的一个命名空间$freelist,这个命名空间用于记录再也不使用的盘区(被删除的Collection或索引)。每当命名空间须要分配新盘区时,会先查看$freelist是否有大小合适的盘区可使用,若是有就回收空闲的磁盘空间。
C、C++、C#、Java、Node.js、Perl、Php 等
MongoDB 用 use + 数据库名称 的方式来建立数据库。 use 会建立一个新的数据库,若是该数据库存在,则返回这个数据库。
使用命令"show dbs"
分片是将数据水平切分到不一样的物理节点。当应用数据愈来愈大的时候,数据量也会愈来愈大。当数据量增加时,单台机器有可能没法存储数据或可接受的读取写入吞吐量。利用分片技术能够添加更多的机器来应对数据量增长以及读写操做的要求。
使用命令"db.adminCommand(“connPoolStats”)"
>db.adminCommand(“connPoolStats”)复制代码
复制是将数据同步到多个服务器的过程,经过多个数据副本存储到多个服务器上增长数据可用性。复制能够保障数据的安全性,灾难恢复,无需停机维护(如备份,重建索引,压缩),分布式读取数据。
要想将数据插入 MongoDB 集合中,须要使用 insert() 或 save() 方法。
>db.collectionName.insert({"key":"value"})
>db.collectionName.save({"key":"value"})复制代码
MongoDB 的 dropDatabase() 命令用于删除已有数据库。
>db.dropDatabase()复制代码
在 MongoDB 中,建立集合采用db.createCollection(name, options)方法。 options 是一个用来指定集合配置的文档。
>db.createCollection("collectionName")db.createCollection() - MongoDB Manual>db.createCollection("复制代码
可使用show collections 查看当前数据库中的全部集合清单
>show collections复制代码
MongoDB 利用 db.collection.drop() 来删除数据库中的集合。
>db.CollectionName.drop()复制代码
数据库分析工具(Database Profiler)会针对正在运行的mongod实例收集数据库命令执行的相关信息。包括增删改查的命令以及配置和管理命令。分析器(profiler)会写入全部收集的数据到 system.profile集合,一个capped集合在管理员数据库。分析器默认是关闭的你能经过per数据库或per实例开启。
默认MongoDB不支持主键和外键关系。 用Mongodb自己的API须要硬编码才能实现外键关联,不够直观且难度较大。
String、Integer、Double、Boolean、Object、Object ID、Arrays、Min/Max Keys、Datetime、Code、Regular Expression等
"Code"类型用于在文档中存储 JavaScript 代码。
"Regular Expression"类型用于在文档中存储正则表达式
"ObjectID"数据类型用于存储文档id
要想将数据插入 MongoDB 集合中,须要使用insert()或save()方法。
>db.collectionName.insert({"key":"value"})
>db.collectionName.save({"key":"value"})复制代码
一共有四部分组成:时间戳、客户端ID、客户进程ID、三个字节的增量计数器
_id是一个 12 字节长的十六进制数,它保证了每个文档的惟一性。在插入文档时,须要提供 _id 。若是你不提供,那么 MongoDB 就会为每一文档提供一个惟一的 id。 _id 的头 4 个字节表明的是当前的时间戳,接着的后 3 个字节表示的是机器 id 号,接着的 2 个字节表示MongoDB 服务器进程 id,最后的 3 个字节表明递增值。
索引用于高效的执行查询.没有索引MongoDB将扫描查询整个集合中的全部文档这种扫描效率很低,须要处理大量数据。索引是一种特殊的数据结构,将一小块数据集保存为容易遍历的形式。索引可以存储某种特殊字段或字段集的值,并按照索引指定的方式将字段值进行排序。
使用 db.collection.createIndex() 在集合中建立一个索引
>db.collectionName.createIndex({columnName:1})复制代码
使用pretty() 方法能够格式化显示结果
>db.collectionName.find().pretty()复制代码
在 find() 方法中,若是传入多个键,并用逗号( , )分隔它们,那么 MongoDB 会把它当作是AND条件。
>db.mycol.find({key1:value1, key2:value2}).pretty()复制代码
若基于OR条件来查询文档,可使用关键字$or。
>db.mycol.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()复制代码
update() 与 save() 方法都能用于更新集合中的文档。 update() 方法更新已有文档中的值,而 save() 方法则是用传入该方法的文档来替换已有文档。
MongoDB 利用 remove() 方法 清除集合中的文档。它有 2 个可选参数:
>db.collectionName.remove({key:value})复制代码
MongoDB 中的文档排序是经过 sort() 方法来实现的。 sort() 方法能够经过一些参数来指定要进行排序的字段,并使用 1 和 -1 来指定排
序方式,其中 1 表示升序,而 -1 表示降序。
>db.connectionName.find({key:value}).sort({columnName:1})复制代码
聚合操做可以处理数据记录并返回计算结果。聚合操做能将多个文档中的值组合起来,对成组数据执行各类操做,返回单一的结果。它至关于 SQL 中的 count(*) 组合 group by。对于 MongoDB 中的聚合操做,应该使用 aggregate() 方法。
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)复制代码
在MongoDB中副本集由一组MongoDB实例组成,包括一个主节点多个次节点,MongoDB客户端的全部数据都写入主节点(Primary),副节点从主节点同步写入数据,以保持全部复制集内存储相同的数据,提升数据可用性。
欢迎关注公众号:程序员追风,回复 003 领取一套200页的2020最新的Java面试题手册。