丰富的线上&线下活动,深入探索云世界
做任务,得社区积分和周边
最真实的开发者用云体验
让每位学生受益于普惠算力
让创作激发创新
资深技术专家手把手带教
遇见技术追梦人
技术交流,直击现场
海量开发者使用工具、手册,免费下载
极速、全面、稳定、安全的开源镜像
开发手册、白皮书、案例集等实战精华
为开发者定制的Chrome浏览器插件
MongoDB是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB旨在给WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB将数据存储给一个文档,数据结构由键值(key=>value)对组成。MongoDB文档类似于JSON对象。字段值可以包含其他文档,数组及文档数组。
(1)MongoDB是一个面向文档存储的数据库,操作起来比较简单和容易。
(2)你可以在MongoDB记录中设置任何属性的索引(如:FirstName="Sameer",Address="8GandhiRoad")来实现更快的排序。
(3)你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
(4)如果负载的增加(需要更多的存储空间和更强的处理能力),它可以分布在计算机网络中的其他节点上这就是所谓的分片。
(5)Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
(6)MongoDb使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段。
(7)Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
(8)Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
(9)Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
(10)GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
(11)MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
NoSQL是非关系型数据库,NoSQL=NotOnlySQL。
关系型数据库采用的结构化的数据,NoSQL采用的是键值对的方式存储数据。
在处理非结构化/半结构化的大数据时;在水平方向上进行扩展时;随时应对动态增加的数据项时可以优先考虑使用NoSQL数据库。
再考虑数据库的成熟度;支持;分析和商业智能;管理及专业性等问题时,应优先考虑关系型数据库。
NoSQL数据库的类型
例如:MongoDB,Cassandra,CouchDB,Hypertable,Redis,Riak,HBASE,Memcache
MySQL和MongoDB两者都是免费开源的数据库。MySQL和MongoDB有许多基本差别包括数据的表示(datarepresentation),查询,关系,事务,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会积极的预分配预留空间来防止文件系统碎片。
它是当前备份集群(replicaset)中负责处理所有写入操作的主要节点/成员。在一个备份集群中,当失效备援(failover)事件发生时,一个另外的成员会变成primary。
Seconday从当前的primary上复制相应的操作。它是通过跟踪复制oplog(local.oplog.rs)做到的。
不用。不管你有没有调用getLastError(又叫"SafeMode")服务器做的操作都一样。调用getLastError只是为了确认写操作成功提交了。当然,你经常想得到确认,但是写操作的安全性和是否生效不是由这个决定的。
为开发便捷起见,我们建议以非集群分片(unsharded)方式开始一个MongoDB环境,除非一台服务器不足以存放你的初始数据集。从非集群分片升级到集群分片(sharding)是无缝的,所以在你的数据集还不是很大的时候没必要考虑集群分片(sharding)。
每一个分片(shard)是一个分区数据的逻辑集合。分片可能由单一服务器或者集群组成,我们推荐为每一个分片(shard)使用集群。
MongoDB分片是基于区域(range)的。所以一个集合(collection)中的所有的对象都被存放到一个块(chunk)中。只有当存在多余一个块的时候,才会有多个分片获取数据的选项。现在,每个默认块的大小是64Mb,所以你需要至少64Mb空间才可以实施一个迁移。
更新操作会立即发生在旧的分片(shard)上,然后更改才会在所有权转移(ownershiptransfers)前复制到新的分片上。
如果一个分片(shard)停止了,除非查询设置了“Partial”选项,否则查询会返回一个错误。如果一个分片(shard)响应很慢,MongoDB则会等待它的响应。
db._adminCommand("connPoolStats");
不需要,移动操作是一致(consistent)并且是确定性的(deterministic);一次失败后,移动操作会不断重试;当完成后,数据只会出现在新的分片里(shard)。
可以。
更新操作会立即发生在旧的块(Chunk)上,然后更改才会在所有权转移前复制到新的分片上。
不会,只会在A:{B,C}上使用索引。
如果一个分片停止了,除非查询设置了“Partial”选项,否则查询会返回一个错误。如果一个分片响应很慢,MongoDB会等待它的响应。
MongoDB支持存储过程,它是javascript写的,保存在db.system.js表中。
GridFS是一种将大型文件存储在MongoDB中的文件规范。使用GridFS可以将大文件分隔成多个小文档存放,这样我们能够有效的保存大文档,而且解决了BSON对象有限制的问题。
MongoDB采用的预分配空间的方式来防止文件碎片。
分析器就是explain显示每次操作性能特点的数据库分析器。通过分析器可能查找比预期慢的操作
是的,用户移除属性然后对象会重新保存(re-save())。
是的
一般磁盘的写操作都是延迟执行的
因为mongodb设计就是轻量高性能,所以没有传统的锁和复杂的事务的回滚
当前备份集群负责所有的写入操作的主要节点,在集群中,当主节点(master)失效,另一个成员会变为master
调用getLastError可以确认当前的写操作是否成功的提交
分片可能是单一的服务器或者集群组成,推荐使用集群
mongodb分片是基于区域的,所以一个集合的所有对象都放置在同一个块中,只有当存在多余一个块的时候,才会有多个分片获取数据的选项
会立即更新旧的分片,然后更改才会在所有权转移前复制到新的分片上
db._adminCommand("connPoolStats");53、mongodb的结构介绍数据库中存储的对象设计bson,一种类似json的二进制文件,由键值对组成
键值对–》文档–》集合–》数据库
MongoDB用c++编写的,流行的开源数据库MySQL也是用C++开发的。C++1983年发行是一种使用广泛的计算机程序设计语言。它是一种通用程序设计语言,支持多种编程模式。
文档由一组keyvalue组成。文档是动态模式,这意味着同一集合里的文档不需要有相同的字段和结构。在关系型数据库中table中的每一条记录相当于MongoDB中的一个文档。
mongod是处理MongoDB系统的主要进程。它处理数据请求,管理数据存储,和执行后台管理操作。当我们运行mongod命令意味着正在启动MongoDB进程,并且在后台运行。
它是一个命令行工具用于连接一个特定的mongod实例。当我们没有带参数运行mongo命令它将使用默认的端口号和localhost连接
MongoDB用use+数据库名称的方式来创建数据库。use会创建一个新的数据库,如果该数据库存在,则返回这个数据库。
非关系型数据库是对不同于传统关系型数据库的统称。非关系型数据库的显著特点是不使用SQL作为查询语言,数据存储不需要特定的表格模式。由于简单的设计和非常好的性能所以被用于大数据和WebApps等
数据文件每新分配一次,它的大小都是上一个数据文件大小的2倍,每个数据文件最大2G。
MongoDB每个集合和每个索引都对应一个命名空间,这些命名空间的元数据集中在16M的*.ns文件中,平均每个命名占用约628字节,也即整个数据库的命名空间的上限约为24000。
如果每个集合有一个索引(比如默认的_id索引),那么最多可以创建12000个集合。如果索引数更多,则可创建的集合数就更少了。同时,如果集合数太多,一些操作也会变慢。
要建立更多的集合的话,MongoDB也是支持的,只需要在启动时加上“--nssize”参数,这样对应数据库的命名空间文件就可以变得更大以便保存更多的命名。这个命名空间文件(.ns文件)最大可以为2G。
每个命名空间对应的盘区不一定是连续的。与数据文件增长相同,每个命名空间对应的盘区大小都是随分配次数不断增长的。目的是为了平衡命名空间浪费的空间与保持一个命名空间数据的连续性。
需要注意的一个命名空间$freelist,这个命名空间用于记录不再使用的盘区(被删除的Collection或索引)。每当命名空间需要分配新盘区时,会先查看$freelist是否有大小合适的盘区可以使用,如果有就回收空闲的磁盘空间。
C、C++、C#、Java、Node.js、Perl、Php等
使用命令"showdbs"
分片是将数据水平切分到不同的物理节点。当应用数据越来越大的时候,数据量也会越来越大。当数据量增长时,单台机器有可能无法存储数据或可接受的读取写入吞吐量。利用分片技术可以添加更多的机器来应对数据量增加以及读写操作的要求。
使用命令"db.adminCommand(“connPoolStats”)"
>db.adminCommand(“connPoolStats”)73、什么是复制复制是将数据同步到多个服务器的过程,通过多个数据副本存储到多个服务器上增加数据可用性。复制可以保障数据的安全性,灾难恢复,无需停机维护(如备份,重建索引,压缩),分布式读取数据。
要想将数据插入MongoDB集合中,需要使用insert()或save()方法。
>db.collectionName.insert({"key":"value"})db.collectionName.save({"key":"value"})
MongoDB的dropDatabase()命令用于删除已有数据库。
>db.dropDatabase()76、在MongoDB中如何创建一个集合。在MongoDB中,创建集合采用db.createCollection(name,options)方法。options是一个用来指定集合配置的文档。
>db.createCollection("collectionName")db.createCollection()-MongoDBManual>db.createCollection("77、在MongoDB中如何查看一个已经创建的集合可以使用showcollections查看当前数据库中的所有集合清单
>showcollections78、在MongoDB中如何删除一个集合MongoDB利用db.collection.drop()来删除数据库中的集合。
默认MongoDB不支持主键和外键关系。用Mongodb本身的API需要硬编码才能实现外键关联,不够直观且难度较大。
String、Integer、Double、Boolean、Object、ObjectID、Arrays、Min/MaxKeys、Datetime、Code、RegularExpression等
"Code"类型用于在文档中存储JavaScript代码。
"RegularExpression"类型用于在文档中存储正则表达式
"ObjectID"数据类型用于存储文档id
索引用于高效的执行查询.没有索引MongoDB将扫描查询整个集合中的所有文档这种扫描效率很低,需要处理大量数据。索引是一种特殊的数据结构,将一小块数据集保存为容易遍历的形式。索引能够存储某种特殊字段或字段集的值,并按照索引指定的方式将字段值进行排序。
使用db.collection.createIndex()在集合中创建一个索引
>db.collectionName.createIndex({columnName:1})89、用什么方法可以格式化输出结果使用pretty()方法可以格式化显示结果
>db.collectionName.find().pretty()90、如何使用"AND"或"OR"条件循环查询集合中的文档在find()方法中,如果传入多个键,并用逗号(,)分隔它们,那么MongoDB会把它看成是AND条件。
>db.mycol.find({key1:value1,key2:value2}).pretty()若基于OR条件来查询文档,可以使用关键字$or。
>db.mycol.find({$or:[{key1:value1},{key2:value2}]}).pretty()91、在MongoDB中如何更新数据update()与save()方法都能用于更新集合中的文档。update()方法更新已有文档中的值,而save()方法则是用传入该方法的文档来替换已有文档。
>db.collectionName.remove({key:value})93、在MongoDB中如何排序MongoDB中的文档排序是通过sort()方法来实现的。sort()方法可以通过一些参数来指定要进行排序的字段,并使用1和-1来指定排序方式,其中1表示升序,而-1表示降序。
>db.connectionName.find({key:value}).sort({columnName:1})94、什么是聚合聚合操作能够处理数据记录并返回计算结果。聚合操作能将多个文档中的值组合起来,对成组数据执行各种操作,返回单一的结果。它相当于SQL中的count(*)组合groupby。对于MongoDB中的聚合操作,应该使用aggregate()方法。
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)95、在MongoDB中什么是副本集在MongoDB中副本集由一组MongoDB实例组成,包括一个主节点多个次节点,MongoDB客户端的所有数据都写入主节点(Primary),副节点从主节点同步写入数据,以保持所有复制集内存储相同的数据,提高数据可用性。