MongoDB for node.js developers 七周学习-最终测试小结(2)
还剩下一半:6、添加优化 7、游标 8、副本 9、片键 10、explain方法
6、添加优化
怎么加快insert的速度呢?
可以清除掉所有的index,因为有index再插入后MongoDB要维持index需要额外的开销
db.collection.dropIndex(index) //index TYPE string or document
也可以修改写入关注(write concern),默认是W: 1,J: 0。
db.messages.insert({_id: 1}); //先插入一个id为1的文档 WriteResult({ "nInserted" : 1 }) db.messages.insert({_id: 1},{ writeConcern: { w: 1 }}); //默认设置下w=1,所以其实跟上面一个命令一个意思,但不能有id一样的文档,所以返回错误信息 WriteResult({ "nInserted" : 0, "writeError" : { "code" : 11000, "errmsg" : "E11000 duplicate key error index: enron.messages.$_id_ dup key: { : 1.0 }" } }) db.messages.insert({_id: 1},{ writeConcern: { w: 0 }}); //把w设为0,也就是不等待写入返回结果,所以返回的是个空。 WriteResult({ });
因为减少了等待时间,因此写入的速度也加快了,不过这是以降低安全性为代价的。
7、游标
游标本身提供了很多方法。
Cursor methods
.toArray() - iterates through docs and returns an array of the results
.forEach( func )
.map( func )
.hasNext()
.next()
.objsLeftInBatch() - returns count of docs left in current batch (when exhausted, a new getMore will be issued)
.itcount() - iterates through documents and counts them
.getQueryPlan() - get query plans associated with shape. To get more info on query plans, call getQueryPlan().help().
.pretty() - pretty print each document, possibly over multiple lines
我们可以结合.hasNext()与.next()进行迭代。
var myCursor = db.inventory.find( { type: 'food' } ); while (myCursor.hasNext()) { print(tojson(myCursor.next())); }
8、副本(replication)
副本是为了是数据更有可用性(availability),有一个主服务器处理客户端的请求,有多个备份服务器用于保存主服务器的数据副本。当主服务器崩溃后,备份服务器会自动选举一个成为主服务器。
当主服务器崩溃时,有些数据还来不及同步到备份服务器上,当这台服务器恢复后会比较现在主服务器的操作日志,然后进行回滚,将崩溃之前未复制的操作撤销,然后才能进行同步。
9、片键
分片是为了提供更大的负载,将原本的数据拆分到多个服务器上的方式。
片键则是将请求映射到服务器的关系,类似索引概念。
片键选择的时候要尽量避免大量的数据处理集中到一个服务器上,像以"_id"作为片键时,插入新的数据都会在最后一个服务器上,造成局部过热,这违背我们希望分散处理的初衷。
10、explain方法
syntax:db.collection.find().explain() or db.collection.explain() .find()
提供三种模式: "queryPlanner","executionStats", and "allPlansExecution"。信息提供是递进式的,也就是后面提供的更多。
{ "queryPlanner" : { "plannerVersion" : <int>, "namespace" : <string>, "indexFilterSet" : <boolean>, "parsedQuery" : { ... }, "winningPlan" : { "stage" : <STAGE1>, ... "inputStage" : { "stage" : <STAGE2>, ... "inputStage" : { ... } } }, "rejectedPlans" : [ <candidate plan 1>, ... ] }