【php精品源码栏目提醒】:网学会员php精品源码为您提供MongoDB简明速查手册 - 软件工程参考,解决您在MongoDB简明速查手册 - 软件工程学习中工作中的难题,参考学习。
支持海量数据的 MongoDBNoSQL中文来源:http://www.oschina.net/translate/mongodb-flexible-nosql-for-humongous-data英文原文:MongoDB Flexible NoSQL for HumongousData关于这个速查卡MongoDB 是一个文档型数据库,它可以方便的应用于大多数语言。
这个小清单列出了MongoDB 经常使用和容易忘记的一些操作,命令和技术。
配置选项安装选项 两者的语法稍微有点不同,启动 MongoDB 的选项可以通过命令行或者配置文件设置,这里有一个三种选项的设置例子: 命令行 配置文件--dbpath /path/to/db dbpath/path/to/db--auth authtrue-vvv vvvtrue在 mongod 下运行--help 可以列出所有的操作选项,但是这里我们列出了一些最常用的: 操作选项 描述--config 指定其他配置选项的配置文件./path/to/config--dbpath 数据存储目录./path/to/data--port 27017 监听端口号.--logpath 日志输出文件,这是个明确的文件路径,不是目录./path/to/file.log 重启后,以追加的方式创建日志防止把之前的日志删除了。
--logappend 在使用--logpath 时总是开启.--fork 把 mongod 配置为守护进程.--auth 单个服务器的安全验证.--keyFile 副本集和分片时安全验证,需要使用一个路径共享密钥。
/path/to/key.txt--nohttpinterface 关闭 http 访问接口--bind_ip address 只允许指定的网络 ip 访问.如果想安全的启动 mongod,就要使用 nohttpinterface 和 bind_ip 操作选项,确定外网不能直接访问。
尤其确保你没有其余的选项启动,MongoDB 需要以下网络环境可以访问: 单个服务器 - 客户端程序可以获取访问连接 副本集 - 任何成员集能够访问,包括自己;客户端能够访问任何一个成员集,并且 可访问的成员集都能够成为主节点(活跃节点). 分片- mongos 进程必须能够连接到配置的服务器和分片,分片必须能够彼此连接。
客户端程序必须能够连接到 mongos 进程。
配置服务器没必要彼此提供访问连接的 支持。
所有的连接都是通过 tcp 建立的.查看配置 那么现在你如何知道做了什么配置呢?如果你 6 个月前启动 mongod 时做了一堆配置,这里提供了一个 shell 小助手:gtdb.serverCmdLineOpts quotargvquot : quot./mongodquot quot--portquot quot30000quot quotparsedquot : quotokquot : 1 解析后的字段是从配置文件读取的一些参数列表.使用 shellShell 帮助当你忘记一个命令时,mongodb 提供了许多功能帮助你:gt // basic helpgt help db.help help on db methods db.mycoll.help help on collection methods sh.help sharding helpers rs.help replica sethelpers help admin administrativehelp help connect connecting to a db help ...注意对于数据库,集合,副本集,分片,管理员等提供了单独了帮助功能。
这里没有一一列出,像游标的帮助功能如下:gt // list common cursor functionsgtdb.foo.find.help你可以使用这个功能和小助手作为一个内置的备忘清单。
查看方法的定义如果你不知道一个方法是干什么用的,你可以在 shell 中通过去除括号的方式运行它,查看它的
源码:gt // run the functiongtdb.serverCmdLineOpts quotargvquot : quot./mongodquot quotparsedquot : quotokquot : 1 gt // see its sourcegtdb.serverCmdLineOptsfunction return this._adminCommandquotgetCmdLineOptsquot这可以帮助我们获悉这个方法需要什么参数和抛出什么错误,以及如何在其他语言中使用。
使用编辑功能shell 命令限制多行的支持,因此在里面编写程序很费劲,shell 编辑小助手让它更加简单,打开一个文本编辑器,编辑一个变量,例如:gt x function / some function were going to fill in / gt edit x在编辑器修改一个变量保存退出。
这个变量就在 shell 里面被设定好了。
不管是编辑器的环境变量或者 MongoDB shell 的变量编辑环境,都必须设置使用 edit模式。
你可以在 MongoDB shell 中通过如下命令配置:gt EDITORquot/usr/bin/emacsquot编辑模式在 JavaScript 脚本下是无法使用的,只能在交互的 shell 中使用。
.mongorc.js如果你的主目录下有个.mongorc.js 文件,那么当你启动 shell 时他就会自动运行。
使用它可以初始化任何你经常使用的 helper 方法和你不想意外操作的删除方法.比如,你不想使用默认的 dropDatabase方法了,你可以在.mongorc.js 文件中添加下面的命令:DB.prototype.dropDatabase function printquotNo dropping DBsquotdb.dropDatabase DB.prototype.dropDatabase上面的例子改变了 dropDatabase helper 方法,使他只打印出一行信息,而没有真正的删除数据库.注意这个技巧不是一个安全手段,固执的用户仍然可以在不使用 helper 前提下删除数据库。
然而,移除危险的 admin 权限命令也可以帮助阻止“大堤的奔溃”.几个建议在.mongorc.js 中使用 helper 命令时移除的: DB.prototype.shutdownServer DBCollection.prototype.drop DBCollection.prototype.ensureIndex DBCollection.prototype.reIndex DBCollection.prototype.dropIndexes改变提示shell 的提示可以通过一个方法设置提示变量的方式来改变:prompt function try db.getLastError catch e printe return new Datequot quot如果你设置了提示,每次执行时都会重新返回提示信息(上面的例子将返回最后执行的信息)。
尝试在你的提示里面调用 db.getLastError方法,这将包含默认的提示和服务器重新连接以及返回的错误信息.同时,把任何可能出现异常的用 try/catch 包裹起来,那是非常恼人的,当你的提示变成了一个异常信息操作诊断查看和终止操作你可以通过 currentOp 查看当前操作状态:gtdb.currentOp quotinprogquot : quotopidquot : 123 quotactivequot : false quotlocktypequot : quotwritequot quotwaitingForLockquot : false quotsecs_runningquot : 200 quotopquot : quotqueryquot quotnsquot : quotfoo.barquot quotqueryquot : ... ... 使用上面的 opid 字段,你可以终止这个操作:gtdb.killOp123不是所有的操作都能被终止或者立刻终止,通常,操作不会被终止,直到他们获取到锁.active 字段表明操作当前是否在运行,如果一个操作没有运行,通常是要么没启动,要么在等待锁,要么执行了其他操作。
通过 numYields 你可以查看操作执行的时间.索引使用使用 explain来查看当前查询操作使用了哪个索引.gtdb.foo.findcriteria.explain quotcursorquot : quotBasicCursorquot quotisMultiKeyquot : false quotnquot : 2 quotnscannedObjectsquot : 2 quotnscannedquot : 2 quotnscannedObjectsAllPlansquot : 2 quotnscannedAllPlansquot : 2 quotscanAndOrderquot : false quotindexOnlyquot : false quotnYieldsquot : 0 quotnChunkSkipsquot : 0 quotmillisquot : 0 quotindexBoundsquot : quotserverquot : quotubuntu:27017quotexplain输出中有几个重要的字段: n: 返回记录行数. nscanned: 使用索引读取的记录数量. nscannedObjects: 被扫描的文档数量. indexOnly: 如果查询没有使用集合本身. nYields: 查询读取锁的释放时间和等待下次操作时间. indexBounds: 当使用索引时,显示的索引扫描范围.游标类型一个遍历游标(BasicCursor)意味着没有使用索引;一个 B 树游标BtreeCursor意味着使用了一个常用的索引;平行游标被用于分片;二维空间索引(geospatial indexes)使用他们自己特殊的游标。
一旦一个数组被索引,那么索引上就会设定一个“multikey”标记,这就是对上面isMultiKey 字段的解释。
这个标记在索引生命周期内一直保存,除非你去掉了数组的索引。
如果应用索引做查询的话,explain 输出的信息里将包含索引范围字段,它描述了索引 比如,遍历到的那部分记录。
如果你知道你的文档里面有个 age 字段,并且年龄在 0-120之间均匀分布,索引范围从 3-5,你可以看到索引只需扫描一小部分数据就能满足你的查询需要。
暗示(Hinting)使用 hint能让查询强制使用一个特殊的索引:gtdb.foo.find.hintx:1这个暗示必须和你想使用的的索引 key 相匹配,你可以通过运行下面命令查看可用的索引:gtdb.foo.getIndexes一般来说,你可以创建一个索引用于查询。
如果你有一个查询和排序,建索引最合适的字段取决于你的查询。
如果查询一个单一的值(如: , x:y) 索引应该这样建queryField:1 sortField: 1。
如果查询的是一个范围或者集合,采用这样的方式建索引可能更高效:sortField: 1 queryField: 1。
如果你是用这个索引,MongoDB 必须扫描所有的索引查找结果集,但是它可以在不使用内存排序的情况下返回有序的结果。
系统性能分析你可以打开系统分析,看看数据库的操作信息。
虽然性能上会有损失,但可以帮助我们避免慢查询。
gtdb.setProfilingLevel2 // profile all operationsgtdb.setProfilingLevel1 // profile operations that take longerthan 100msgtdb.setProfilingLevel1 500 // profile operations that takelonger than 500msgtdb.setProfilingLevel0 // turn off profilinggtdb.getProfilingLevel1 // see current profiling setting性能条目保存在开启性能分析的数据库中名为 system.profile 的集合。
可以针对单个数据库开启和关闭性能分析。
副本集要找到延迟的复制,连接到一个备节点并运行这个函数:gtdb.printReplicationStatusconfiguredoplog size: 2000MBlog length start to end: 23091secs 6.4hrsoplog first event time: Fri Aug 10 2012 04:33:03 GMT0200 CESToplog last event time: Mon Aug 20 2012 10:56:51 GMT0200 CESTnow: Mon Aug 20 2012 10:56:51GMT0200 CEST要查看某个成员对集合的性能状况,连接到这个成员,并运行:gtrs.status此命令会告诉你其他成员之于它的状态和地位。
在一个备节点上运行 rs.status 将告诉你备节点是从 syncingTo 字段中哪个中同步数据的。
分片要查看群集的元数据(分片,数据库,文件,数据等),请运行下面的函数:gtdb.printShardingStatusgtdb.printShardingStatustrue // show all chunks您也可以连接到 Mongos ,使用“use config”查看分片,数据库,集合,或块的数据,然后查询相关的集合。
gt use configswitched to dbconfiggt show collectionschunksdatabaseslockpingslocksmongossettingsshardssystem.indexesversion永远都连接到 mongos 获取分片信息。
永远不要直接连接配置服务器。
永远不要直接写入配置服务器。
。
永远使用分片命令和帮助。
在维护之后,有时实际上没有实施维护的 mongos 进程的配置版本号将不会更新。
无论是回弹服务还是运行 flushRouterConfig 命令都能快速解决问题。
gt use admingtdb.runCommandflushRouterConfig:1通常这个问题将表现为 setShardVersion 失败的错误。
无需担心日志中的 setShardVersion 错误,但它们不应该出现在您的应用程序中(除非 mongos 无法连接到任何配置服务器,否则你不应该得到错误)。
D要添加新的分片,运行:gtdb.addShardquotrsName/seed1seed2seed3quot要在数据库上运用分片,运行:gtdb.adminCommandenableSharding: true要在集合上运用分片,运行:gtdb.adminCommandshardCollection: quotdbName.collNamequotunique: true key: fieldName: 1既不应该已经存在 dbName.collName,也不应该已经索引 fieldName分片关键字。
如果你在使用唯一分片关键字,它必须是唯一索引的。
在集群中,如果你不是在 _id 上分片,_id 无需唯一。
不管怎样,它们都在独立的分片上(就是说,你可以在 shard1 上有一个_id:123,在 shard2 生也有一个_id:123,但它们不能同时存在于 shard1 中)。
文件往往在分片间移动,如果是自己生成的_id,你需要确保你的_id 唯一。
如果你用的是 Object_Id 就不会出问题。
要关闭均衡器,通过的 mongos 更新 config.settings 集合:gtsh.setBalancerStatefalse要恢复,则使用同样的命令,传递一个 True。
Mongo 监控服务 MMSMMS 是一种免费的、易操作的监控 MongoDB 的方式。
要使用它,先在 http://mms.10gen.com. 创建一个账号。
查看 http://mms.10gen.com/help 以获得更多的文档。
简单规则数据库数据库的名称不能包含 quot.quot,quotquot,quot0quot(空字符)。
名称只能包含在你的文件系统中可以用做文件名的字符。
Admin,config,local 是数据库的保留名(你可以在其中保存数据,单永远不要删除它们)。
另一个强大的选项是 post-commit 钩子。
钩子将在提交到库时被触发。
这是比周期构建或 Poll SCM 选项更高效的方法。
集合集合名不能含有 quotquot 或 quot0quot。
前缀为 quotsystem.quot 的名字为 MongoDB 的保留集合,不能删除(哪怕是你创建的)。
“点”经常被用于集合名称的组织,但它们没有语义。
名为“che.se”的集合跟名为“che”的集合以及名为“cheese”的集合没有任何关联。
字段名字段名不能含有 quot.quot 或 quot0quot。
当字段为数据库引用时,它应当只含有quotquot。
索引选项background 在后台建立索引,同时可数据库可读写unique 每个键的值都是唯一的。
不索引不存在的值。
轻松索引文档中的唯一字段,而没有该字段sparse 的文档不参与索引。
expireAfterSeconds 设定集合的生存时间。
当创建唯一索引时,遭遇重复则删除,而非报错。
注意,这个选dropDups 项将删除有重复值的文档。
查询格式查询语句通常为一下格式:key : op : value例如:age : gte : 18有三个例外的规则: and or 和 nor,此三者优先级最高:or : age: gte : 18 age : lt : 18parentalConsent:true更新格式更新语句总是如下格式:key : mod : value例如:age : inc : 1查询操作符 √: 匹配 x: 不匹配 操作符 查询示例 文档示例 √ numSold: 1gt gte lt lte ne numSold : lt:3 x numSold: quothelloquot x x : 1 √ age: 21 age : in : 10 14in nin √ age: 9 10 11 21 x age: 9 √ hand: quot7quot quot8quot quot9quot hand : all :all quot10quot quotJquot quotQquot quotKquot quotAquot quot10quotquotJquotquotQquotquotKquotquotAquot x hand:quotJquotquotQquotquotKquot √ name: quotJonquotnot name : not : /jon/i x name: quotJohnquot √ age: 50mod age : mod : 10 0 x age: 42exists phone: exists: true √ phone: quot555-555- 5555quot x phones: quot555-555- 5555quot quot1-800-555- 5555quot √ age : quot42quottype age : type : 2 x age : 42 √ quottop-threequot:quotgoldquotquots ilverquotquotbronzequotsize quottop-threequot:size:3 x quottop-threequot:quotblue ribbonquot参见 http://www.mongodb.org/display/DOCS/AdvancedQueries 获取全部类型。
更新修饰符 修饰符 初始文档 修改示例 最终文档set x:quotfooquot set:x:123 x:123unset x:quotfooquot unset:x:true inc:countdown:-1inc countdown:5 countdown:4 push votes:-1-11 push:votes:-1 votes:-1-11-1pushAll blacklist:quotip1quot blacklist:quotip1quotquotip2quotquotip pull:blacklist:quotip2quotpull pullAll quotip3quot blacklist: 3quot quotip1quotquotip3quot queue:quot1pmquotquot3pmquotquot8 queue:quot3pmquotquot8ppop pop:queue:-‐1 pmquot mquotaddToSete addToSet:ints: ints:0134 ints:01234ach each:123 .