韦陀 發表於 2015-6-23 19:32:00

MongoDB使用小结:一些常用操作分享

<p><span style="font-family: &quot;Microsoft Yahei&quot;; color: rgba(255, 0, 0, 1)">本文整理了一年多以来我常用的<span lang="EN-US">MongoDB操作,涉及mongo<span lang="EN-US">-shell、<span lang="EN-US">pymongo,既有运维层面也有应用层面,内容有浅有深,这也就是我从零到熟练的历程。</span></span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;; color: rgba(255, 0, 0, 1)"><span lang="EN-US"><span lang="EN-US"><span lang="EN-US">MongoDB的使用之前也分享过一篇,稍微高阶点:见这里:《MongoDB使用小结》<br></span></span></span></span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">1、shell登陆和显示</p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">假设在本机上有一个端口为17380的MongoDB服务,假设已经把mongo bin文件加入到系统PATH下。</span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">登陆:<span lang="EN-US">mongo --port 17380&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">显示<span lang="EN-US">DB:<span lang="EN-US">show dbs</span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">进入某<span lang="EN-US">DB:<span lang="EN-US">use test_cswuyg</span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">显示集合:<span lang="EN-US">show tables</span></span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">2、简单查找</p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">查找文档:<span lang="EN-US">db.test_mac_id.find({'a': &nbsp;'b'})</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">删除文档:<span lang="EN-US">db.test_mac_id.remove({'a': 'b'})</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">查找找到某一天的数据:</span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">db.a.find({'D' : &nbsp;ISODate('2014-04-21T00:00:00Z')}) 或者&nbsp;</span>db.a.find({'D' : &nbsp;ISODate('2014-04-21')})</span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">删除某一天的数据:</span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">db.region_mac_id_result.remove({"D" : &nbsp;ISODate('2014-04-17')})</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;">小于<span lang="EN-US">2014.6.5的数据:</span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">db.xxx.find({E: {$lt :ISODate('2014-06-05')}})</span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;">大于等于<span lang="EN-US">2014.6.1的数据:</span></span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">db.xxx.find({E: {$gte: ISODate("2014-05-29")}}).count()</span></span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;">两个条件:</span></span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">db.xxx.find({E:{$gte: ISODate("2014-05-29"), $lte: ISODate("2014-06-04")}}).count()</span></span></span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US">json中的嵌套对象查询,采用“点”的方式:</span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">mongos&gt; db.wyg.find({"a.b": {$exists: true}})</span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">{ "_id" : "c", "a" : { "b" : 10 } }</span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;">某个字段存在,且小于<span lang="EN-US">1000有多少:</span></span></span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">db.stat.find({_: &nbsp;ISODate("2014-06-17"), "123": {$exists: 1, $lte: 1000}}, {"123": 1}).count()</span></span></span></span></span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">3、存在和遍历统计</p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">存在'i'<span lang="EN-US">: 1,且存在<span lang="EN-US">old_id字段:</span></span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">mongos&gt; var it = db.test.find({'i': 1, "old_id": {$exists: 1}})</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">遍历计数<span lang="EN-US">1:</span></span><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">mongos&gt; var count = 0;while(it.hasNext()){if (it.next()["X"].length==32)++count}print(count)</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">遍历计数<span lang="EN-US">2:</span></span><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">mongos&gt; var count = 0;while(it.hasNext()){var item = it.next(); if (item['X'].length==32 &amp;&amp; item['_id'] != item['X'])++count;if(!item['X'])++count;}print(count)</span></span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">4、插入和更新</p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">&gt; db.test.findOne({_id: &nbsp;'cswuyg'})</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">null</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">&gt; db.test.insert({'_id': 'cswuyg', 'super_admin': true})</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">&gt; db.test.findOne({'_id': 'cswuyg'})</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">{</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">&nbsp; &nbsp; &nbsp; &nbsp; "_id" : "cswuyg",</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">&nbsp; &nbsp; &nbsp; &nbsp; "super_admin" : true</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">}</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">db.test.update({'_id': 'cswuyg'}, {$set: {'super_admin': true}})</span></span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">5、repair 操作</p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">对某个DB执行repair:进入要<span lang="EN-US">repair的<span lang="EN-US">db,执行<span lang="EN-US">db.repairDatabase()</span></span></span></span></p>
<p>对<span lang="EN-US"><span lang="EN-US">mongodb整个实例执行<span lang="EN-US">repair:<span lang="EN-US">numactl --interleave=all /mongod --repair --dbpath=<span lang="EN-US">/home/disk1/mongodata/shard/&nbsp;</span></span></span></span></span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">6、mongodb任务操作</p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">停止某个操作:</span></p>
<div class="cnblogs_code">
<pre>$ mongo --port 17380<span style="color: rgba(0, 0, 0, 1)">
MongoDB shell version: </span>2.4.5<span style="color: rgba(0, 0, 0, 1)">
connecting to: </span>127.0.0.1:17380/test
mongos&gt;<span style="color: rgba(0, 0, 0, 1)"> db.currentOp()
{ </span>"inprog"<span style="color: rgba(0, 0, 0, 1)"> : [ ...] }

mongos</span>&gt; db.killOp("shard0001:163415563")</pre>
</div>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">批量停止:</span></p>
<div class="cnblogs_code">
<pre>db.currentOp().inprog.forEach(<span style="color: rgba(0, 0, 255, 1)">function</span>(item){db.killOp(item.opid)})</pre>
</div>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">当查询超过<span lang="EN-US">1000秒的,停止:</span></span></p>
<div class="cnblogs_code">
<pre>db.currentOp().inprog.forEach(<span style="color: rgba(0, 0, 255, 1)">function</span>(item){<span style="color: rgba(0, 0, 255, 1)">if</span>(item.secs_running &gt; 1000 )db.killOp(item.opid)})</pre>
</div>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">停止某个数据源的查询:</span></p>
<div class="cnblogs_code">
<pre>db.currentOp().inprog.forEach(<span style="color: rgba(0, 0, 255, 1)">function</span>(item){<span style="color: rgba(0, 0, 255, 1)">if</span>(item.ns == "cswuyg.cswuyg")db.killOp(item.opid)})</pre>
</div>
<p><strong><span style="font-family: &quot;Microsoft Yahei&quot;">把所有在等待锁的操作显示出来:</span></strong></p>
<div class="cnblogs_code">
<pre>db.currentOp().inprog.forEach(<span style="color: rgba(0, 0, 255, 1)">function</span>(item){<span style="color: rgba(0, 0, 255, 1)">if</span>(item.waitingForLock)print(JSON.stringify(item))})</pre>
</div>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">把处于等待中的分片显示出来:</span></p>
<div class="cnblogs_code">
<pre>db.currentOp().inprog.forEach(<span style="color: rgba(0, 0, 255, 1)">function</span>(item){<span style="color: rgba(0, 0, 255, 1)">if</span>(item.waitingForLock){print(item.opid.substr(0,9));print(item.op);}})</pre>
</div>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">把非等待的分片显示出来:</span></p>
<div class="cnblogs_code">
<pre>db.currentOp().inprog.forEach(<span style="color: rgba(0, 0, 255, 1)">function</span>(item){<span style="color: rgba(0, 0, 255, 1)">if</span>(!item.waitingForLock){<span style="color: rgba(0, 0, 255, 1)">var</span> lock_info = item["opid"];print(lock_info.substr(0,9));print(item["op"]);}})</pre>
</div>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">查找所有的查询任务:</span></p>
<div class="cnblogs_code">
<pre>db.currentOp().inprog.forEach(<span style="color: rgba(0, 0, 255, 1)">function</span>(item){<span style="color: rgba(0, 0, 255, 1)">if</span>(item.op=="query"){print(item.opid);}})</pre>
</div>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">查找所有的非查询任务:</span></p>
<div class="cnblogs_code">
<pre>db.currentOp().inprog.forEach(<span style="color: rgba(0, 0, 255, 1)">function</span>(item){<span style="color: rgba(0, 0, 255, 1)">if</span>(item.op!="query"){print(item.opid);}})</pre>
</div>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">查找所有的操作:</span></p>
<div class="cnblogs_code">
<pre>db.currentOp().inprog.forEach(<span style="color: rgba(0, 0, 255, 1)">function</span>(item){print(item.op, item.opid);});</pre>
</div>
<p><span style="color: rgba(0, 0, 0, 1); font-family: &quot;Microsoft Yahei&quot;">常用js脚本,可直接复制到mongo-shell下使用:</span></p>
<p><span style="color: rgba(255, 0, 0, 1); font-family: &quot;Microsoft Yahei&quot;">显示当前所有的任务状态:</span></p>
<div class="cnblogs_code">
<pre>print("##########");db.currentOp().inprog.forEach(<span style="color: rgba(0, 0, 255, 1)">function</span>(item){<span style="color: rgba(0, 0, 255, 1)">if</span>(item.waitingForLock){<span style="color: rgba(0, 0, 255, 1)">var</span> lock_info = item["opid"];print("waiting:",lock_info,item.op,item.ns);}});print("----");db.currentOp().inprog.forEach(<span style="color: rgba(0, 0, 255, 1)">function</span>(item){<span style="color: rgba(0, 0, 255, 1)">if</span>(!item.waitingForLock){<span style="color: rgba(0, 0, 255, 1)">var</span> lock_info = item["opid"];print("doing",lock_info,item.op,item.ns);}});print("##########");</pre>
</div>
<p><span style="font-family: &quot;Microsoft Yahei&quot;; color: rgba(255, 0, 0, 1)">杀掉某些特定任务:</span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">(1)</span></p>
<div class="cnblogs_code">
<pre>db.currentOp().inprog.forEach(<span style="color: rgba(0, 0, 255, 1)">function</span>(item){<span style="color: rgba(0, 0, 255, 1)">if</span>(item.waitingForLock){<span style="color: rgba(0, 0, 255, 1)">var</span> lock_info = item["opid"];<span style="color: rgba(0, 0, 255, 1)">if</span>(item.op=="query" &amp;&amp; item.secs_running &gt;60 &amp;&amp; item.ns=="cswuyg.cswuyg"){db.killOp(item.opid)}}})</pre>
</div>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">(2)</span></span></p>
<div class="cnblogs_code">
<pre>db.currentOp().inprog.forEach(<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(item) {
</span><span style="color: rgba(0, 0, 255, 1)">var</span> lock_info = item["opid"<span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (item.op == "query" &amp;&amp; item.secs_running &gt; 1000<span style="color: rgba(0, 0, 0, 1)">) {
print(</span>"kill"<span style="color: rgba(0, 0, 0, 1)">, item.opid);
db.killOp(item.opid)
}
})</span></pre>
</div>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">7、删除并返回数据</p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">old_item = db.swuyg.findAndModify({query: {"_id": "aabbccdd"}, fields:{"D": 1,'E':1, 'F':1}, remove: true})</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US">fields里面为<span lang="EN-US">1的是要返回的数据。</span></span></span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">8、分布式集群部署情况</p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">(1)&nbsp;</span></span><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">细致到collection的显示:sh.status()</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">(2)</span></span><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">仅显示分片:</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">use config; db.shards.find()</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">&nbsp; &nbsp; &nbsp; &nbsp; { "_id" : "shard0000", "host" : "xxhost:10001" }</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">&nbsp; &nbsp; &nbsp; &nbsp; { "_id" : "shard0001", "host" : "yyhost:10002" }</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">&nbsp; &nbsp; &nbsp; &nbsp; ....</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">(3)</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US"><span>use admin</span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">db.runCommand({listshards: 1})</span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;">列出所有的<span lang="EN-US">shard server</span></span></span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">9、正则表达式查找</p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">正则表达式查询:<br>mongos&gt;&nbsp;db.a.find({"tt": /t*/i})<br>{&nbsp;"_id"&nbsp;:&nbsp;ObjectId("54b21e0f570cb10de814f86b"),&nbsp;"aa"&nbsp;:&nbsp;"1",&nbsp;"tt"&nbsp;:&nbsp;"tt"&nbsp;}<br>其中i表明是否是case-insensitive,有i则表示忽略大小写</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">db.testing.find({"name"://})</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">当<span lang="EN-US">name的值为<span lang="EN-US">789这几个数字组成的字符串时,查询命中。</span></span></span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">10、查询性能</p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">db.testing.find({name: 123}).explain()</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">输出结果:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">{
      </span>"cursor" : "BasicCursor"<span style="color: rgba(0, 0, 0, 1)">,
      </span>"isMultiKey" : <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
      </span>"n" : 1<span style="color: rgba(0, 0, 0, 1)">,
      </span>"nscannedObjects" : 10<span style="color: rgba(0, 0, 0, 1)">,
      </span>"nscanned" : 10<span style="color: rgba(0, 0, 0, 1)">,
      </span>"nscannedObjectsAllPlans" : 10<span style="color: rgba(0, 0, 0, 1)">,
      </span>"nscannedAllPlans" : 10<span style="color: rgba(0, 0, 0, 1)">,
      </span>"scanAndOrder" : <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
      </span>"indexOnly" : <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
      </span>"nYields" : 0<span style="color: rgba(0, 0, 0, 1)">,
      </span>"nChunkSkips" : 0<span style="color: rgba(0, 0, 0, 1)">,
      </span>"millis" : 0<span style="color: rgba(0, 0, 0, 1)">,
      </span>"indexBounds"<span style="color: rgba(0, 0, 0, 1)"> : {
      },
      </span>"server" : "xxx:10001"<span style="color: rgba(0, 0, 0, 1)">
}</span></pre>
</div>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">11、更新或插入</p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US">当该<span lang="EN-US">key不存在的时候执行插入操作,当存在的时候则不管,可以使用<span lang="EN-US">setOnInsert</span></span></span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">db.wyg.update({'_id': 'id'}, {'$setOnInsert': {'a': 'a'}, '$set': {'b': 'b'}}, true)</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">当<span lang="EN-US">id存在的时候,忽略<span lang="EN-US">setOnInsert。</span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">当<span lang="EN-US">id存在的时候,如果要插入,则插入<span lang="EN-US">{'a': 'a'}</span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">最后的参数<span lang="EN-US">true,则是指明,当<span lang="EN-US">update不存在的<span lang="EN-US">_id时,执行插入操作。默认是<span lang="EN-US">false,只更新,不插入。</span></span></span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US">push、<span lang="EN-US">setOnInsert:</span></span></span></span><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US"><span>db.cswuyg.update({"_id": "abc"}, {$push: {"name": "c"}, $setOnInsert: {"cc":"xx"}}, true)</span></span></span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">12、计算DB中collection的数量</p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">db.system.namespaces.count()</span></span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">13、增加数字,采用$inc</p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">db.cswuyg.update({"a.b": {$exists: true}}, {$inc: {'a.b': 2}})</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">也就是对象<span lang="EN-US">a.b的值,增加了<span lang="EN-US">2</span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">注意<span lang="EN-US">$inc只能用于数值。</span></span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">14、删除某个key</p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">db.cswuyg.update({'_id': 'c'}, {$unset: {'b': {$exists: true}}})</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">{ "_id" : "c", "a" : { "b" : 12 }, "b" : 7 }&nbsp;</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">转变为:</span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">{ "_id" : "c", "a" : { "b" : 12 } }</span></span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">15、增加key:value</p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">db.cswuyg.update({'_id': 'z'}, {'$set': {'hello': 'z'}})</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">{ "_id" : "z", "b" : 1 }</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">转变为:</span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">{ "_id" : "z", "b" : 1, "hello" : "z" }</span></span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">16、删除数据库、删除表</p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">删除数据库:</span></span><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">db.dropDatabase();</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">删除表:</span><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">db.mytable.drop();</span></span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">17、查找到数据只看某列</p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">只显示<span lang="EN-US">key名为<span lang="EN-US">D的数据:db.test.find({}, {D: 1})</span></span></span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">18、查看分片存储情况</p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">(1)所有DB的分片存储信息,包括chunks数、shard key信息:db.printShardingStatus()</span></span></p>
<p>(2)db.collection.getShardDistribution() 获取collection各个分片的数据存储情况</p>
<p>(3)sh.status() 显示本mongos集群所有DB的信息, 包含了Shard Key信息</p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">19、查看collection的索引</p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">db.cswuyg.getIndexes()</span></span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">20、开启某collection的分片功能</p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US">1. ./bin/mongo&nbsp;–<span lang="EN-US">port 20000</span></span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">2. mongos&gt; use admin</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">3. switched to db admin</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">4. mongos&gt; db.runCommand({'enablesharding"' 'test'})</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">5. { "ok" : 1 }</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">开启<span lang="EN-US">user collection分片功能:</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">1. mongos&gt; db.runCommand({'shardcollection': 'test.user', 'key': {'_id': 1}})</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">{ "collectionsharded" : "test.user", "ok" : 1 }</span></span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">21、判断当前是否是shard集群</p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US">isdbgrid:用来确认当前是否是<span lang="EN-US">&nbsp;Sharding Cluster</span></span></span></p>
<div class="cnblogs_code">
<pre>&gt; db.runCommand({isdbgrid:1<span style="color: rgba(0, 0, 0, 1)">});
是:
{ </span>"isdbgrid" : 1, "hostname" : "xxxhost", "ok" : 1<span style="color: rgba(0, 0, 0, 1)"> }
不是:
{
      </span>"ok" : 0<span style="color: rgba(0, 0, 0, 1)">,
      </span>"errmsg" : "no such cmd: isdbgrid"<span style="color: rgba(0, 0, 0, 1)">,
      </span>"code" : 59<span style="color: rgba(0, 0, 0, 1)">,
      </span>"bad cmd"<span style="color: rgba(0, 0, 0, 1)"> : {
                </span>"isdbgrid" : 1<span style="color: rgba(0, 0, 0, 1)">
      }
}</span></pre>
</div>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">22、$addToSet、$each插入数组数据</p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">mongos&gt; db.cswuyg.find()</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">{ "_id" : "wyg", "a" : "c", "add" : [ "a", "b" ] }</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">mongos&gt; db.cswuyg.update({"_id": "wyg"}, {"$set": {"a": "c"}, "$addToSet": {"add": {"$each" :["a", "c"]}}}, true)</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">mongos&gt; db.cswuyg.find()</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">{ "_id" : "wyg", "a" : "c", "add" : [ "a", "b", "c" ] }</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US">$each是为了实现<span lang="EN-US">list中的每个元素都插入,如果没有<span lang="EN-US">$each,则会把整个<span lang="EN-US">list作为一个元素插入,变成了<span lang="EN-US">2维数组。</span></span></span></span></span></span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">&nbsp;$addToSet会判断集合是否需要排重,保证集合不重。$push可以对数组添加元素,但它只是直接插入数据,不做排重。</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">eg:db.test.update({"a": 1},&nbsp;{$push: {"name": {$each:["a",&nbsp;"c"]}}})<br>eg:db.test.update({"a": 1},&nbsp;{$addToSet: {"name": {$each: ["a",&nbsp;"d"]}}})</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;">不去重插入<span lang="EN-US">&nbsp;pushAll</span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">&gt; db.push.insert({"a": "b", "c": ["c", "d"]})</span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">&gt; db.push.find()</span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">{ "_id" : ObjectId("53e4be775fdf37629312b96c"), "a" : "b", "c" : [ "c", "d" ]</span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">}</span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">&gt; db.push.update({"a":"b"}, {$pushAll:{"c": ["z", "d"]}})</span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">&gt; db.push.find()</span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">{ "_id" : ObjectId("53e4be775fdf37629312b96c"), "a" : "b", "c" : [ "c", "d",</span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">"z", "d" ] }</span></span></span></p>
<p>
<span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">pushAll跟push类似,不同的是pushAll可以一次插入多个value,而不需要使用$each。</span></span></span></span></span></span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">23、刷新配置信息</p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">&nbsp;db.runCommand("flushRouterConfig");</span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">24、批量更新</p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">db.xxx.update({"_id": {$exists: 1}}, {$set: {"_" : &nbsp;ISODate("2014-03-21T00: 00:00Z")}}, true, true)</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">最后一个参数表示是否要批量更新,如果不指定,则一次只更新一个<span lang="EN-US">document。</span></span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">25、dump DB</p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;; color: rgba(255, 0, 0, 1)"><span style="font-family: &quot;Microsoft Yahei&quot;">mongodump支持从DB磁盘文件、运行中的MongoD服务中dump出bson数据文件。</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;">(1)关闭MongoD之后,从它的DB磁盘文件<span lang="EN-US">中<span lang="EN-US">dump出数据(注:仅限单实例mongod):</span></span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US">mongodump &nbsp;--dbpath=/home/disk1/mongodata/shard/ -d cswuyg -o /home/disk2/mongodata/shard</span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US">参考:</span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">http://docs.mongodb.org/manual/reference/program/mongodump/</span></span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">http://stackoverflow.com/questions/5191186/how-do-i-dump-data-for-a-given-date</span></span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;">(2)从运行的MongoD中导出指定日期数据,采用-q查询参数:</span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">&nbsp;mongodump -h xxxhost --port 17380 --db cswuyg --collection test -q "{D: {\$gte: {\$date: `date -d "20140410" +%s`000}, \$lt: {\$date: `date +%s`000}}}"&nbsp;</span></span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">mongodump -dbpath=/home/disk3/mongodb/data/shard1/ -d cswuyg -c test -o /home/disk9/mongodata/shard1_2/ -q "{_:{\$gte:{\$date:`date -d "20140916" +%s`000}, \$lt: {\$date: `date -d "20140918" +%s`000}}}"</span></span></span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">dump出来的bson文件去掉了索引、碎片空间,所有相比DB磁盘文件要小很多。</span></span></span></span></span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">26、restore DB</p>
<p><span lang="EN-US"><span lang="EN-US">restore的时候,不能先建索引,必须是<span lang="EN-US">restore完数据之后再建索引,否则<span lang="EN-US">restore的时候会非常慢。</span></span></span></span><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span lang="EN-US">而且一般不需要自己手动建索引,在数据bson文件的同目录下有一个索引bson文件(<span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span lang="EN-US">system.indexes.bson</span></span></span></span>),restore完数据之后会mongorestore自动根据该文件创建索引。</span></span></span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">(1)从某个文件restore</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">mongorestore --host xxxhost --port 17380 --db cswuyg --collection&nbsp;cswuyg&nbsp;./cswuyg_1406330331/cswuyg/cswuyg_bak.bson</span></span></p>
<p>(2)从目录restore</p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">./mongorestore --port 27018 /home/disk2/mongodata/shard/</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US">(3)dump&nbsp;和<span lang="EN-US">&nbsp;restore configure server:</span></span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">&nbsp;mongodump --host xxxhost --port 19913 --db config &nbsp;-o /home/work/cswuyg/test/config</span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">&nbsp;mongorestore --host&nbsp;&nbsp;xxxhost&nbsp;--port 19914 &nbsp;/home/work/cswuyg/test/config</span></span></span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">27、创建索引</p>
<div class="cnblogs_code">
<pre>看看当前的test collection上有啥索引:<br>mongos&gt;<span style="color: rgba(0, 0, 0, 1)"> db.test.getIndexes()
[
      {
                </span>"v" : 1<span style="color: rgba(0, 0, 0, 1)">,
                </span>"key"<span style="color: rgba(0, 0, 0, 1)"> : {
                        </span>"_id" : 1<span style="color: rgba(0, 0, 0, 1)">
                },
                </span>"ns" : "cswuyg.test"<span style="color: rgba(0, 0, 0, 1)">,
                </span>"name" : "_id_"<span style="color: rgba(0, 0, 0, 1)">
      }
]<br>当前只有_id这个默认索引,我要在test collection上为 index 字段创建索引:
mongos</span>&gt; db.test.ensureIndex({"index": 1<span style="color: rgba(0, 0, 0, 1)">})<br>创建完了之后,再看看test collection上的索引有哪些:
mongos</span>&gt;<span style="color: rgba(0, 0, 0, 1)"> db.test.getIndexes()
[
      {
                </span>"v" : 1<span style="color: rgba(0, 0, 0, 1)">,
                </span>"key"<span style="color: rgba(0, 0, 0, 1)"> : {
                        </span>"_id" : 1<span style="color: rgba(0, 0, 0, 1)">
                },
                </span>"ns" : "cswuyg.test"<span style="color: rgba(0, 0, 0, 1)">,
                </span>"name" : "_id_"<span style="color: rgba(0, 0, 0, 1)">
      },
      {
                </span>"v" : 1<span style="color: rgba(0, 0, 0, 1)">,
                </span>"key"<span style="color: rgba(0, 0, 0, 1)"> : {
                        </span>"index" : 1<span style="color: rgba(0, 0, 0, 1)">
                },
                </span>"ns" : "cswuyg.test"<span style="color: rgba(0, 0, 0, 1)">,
                </span>"name" : "index_1"<span style="color: rgba(0, 0, 0, 1)">
      }
]</span></pre>
</div>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;">创建索引,并指定过期时间:<span lang="EN-US">db.a.ensureIndex({'_':-1}, {expireAfterSeconds: 1000}) &nbsp; &nbsp;1000Second.</span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;">修改过期时间:<span lang="EN-US">&nbsp;db.runCommand({"collMod": "a", &nbsp;index: {keyPattern:{"_":&nbsp;-1},&nbsp;expireAfterSeconds:&nbsp;60}})</span></span></span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">28、删除索引</p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US">db.post.dropIndexes()&nbsp;删除<span lang="EN-US">post上所有索引</span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US">db.post.dropIndex({name: 1})&nbsp;删除指定的单个索引</span></span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">29、唯一索引问题</p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">如果集群在<span lang="EN-US">_id上进行了分片,则无法再在其他字段上建立唯一索引:</span></span></p>
<div class="cnblogs_code">
<pre>mongos&gt; db.a.ensureIndex({'b': 1}, {'unique': <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">})
{
      </span>"raw"<span style="color: rgba(0, 0, 0, 1)"> : {
                </span>"set_a/xxxhost:20001,yyyhost:20002"<span style="color: rgba(0, 0, 0, 1)"> : {
                        </span>"createdCollectionAutomatically" : <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
                        </span>"numIndexesBefore" : 1<span style="color: rgba(0, 0, 0, 1)">,
                        </span>"ok" : 0<span style="color: rgba(0, 0, 0, 1)">,
                        </span>"errmsg" : "cannot create unique index over { b: 1.0 } with shard key pattern { _id: 1.0 }"<span style="color: rgba(0, 0, 0, 1)">,
                        </span>"code" : 67<span style="color: rgba(0, 0, 0, 1)">
                },
                </span>"set_b/xxxhost:30001,yyyhost:30002"<span style="color: rgba(0, 0, 0, 1)"> : {
                        </span>"createdCollectionAutomatically" : <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
                        </span>"numIndexesBefore" : 1<span style="color: rgba(0, 0, 0, 1)">,
                        </span>"ok" : 0<span style="color: rgba(0, 0, 0, 1)">,
                        </span>"errmsg" : "cannot create unique index over { b: 1.0 } with shard key pattern { _id: 1.0 }"<span style="color: rgba(0, 0, 0, 1)">,
                        </span>"code" : 67<span style="color: rgba(0, 0, 0, 1)">
                }
      },
      </span>"code" : 67<span style="color: rgba(0, 0, 0, 1)">,
      </span>"ok" : 0<span style="color: rgba(0, 0, 0, 1)">,
      </span>"errmsg" : "{ set_a/xxxhost:20001,yyyhos:20002: \"cannot create unique index over { b: 1.0 } with shard key pattern { _id: 1.0 }\", set_b/xxxhost:30001,yyyhost:30002: \"cannot create unique index over { b: 1.0 } with shard key pattern { _id: 1.0 }\" }"<span style="color: rgba(0, 0, 0, 1)">
}</span></pre>
</div>
<p><span style="font-family: &quot;Microsoft YaHei&quot;">之所以出现这个错误是因为<span lang="EN-US">MongoDB无法保证集群中除了片键以外其他字段的唯一性,能保证片键的唯一性是因为文档根据片键进行切分,一个特定的文档只属于一个分片,<span lang="EN-US">MongoDB只要保证它在那个分片上唯一就在整个集群中唯一,</span></span>实现分片集群上的文档唯一性一种方法是在创建片键的时候指定它的唯一性。</span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">30、因迁移导致出现count得到的数字是真实数字的两倍</p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">cswuyg&gt; db.test.find({D: ISODate('2015-08-31'), B: 'active'}).count()</span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">52118</span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">cswuyg&gt; db.test.find({D: ISODate('2015-08-31'), B: 'active'}).forEach(function(item){db.test_count.insert(item)})</span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">cswuyg&gt; db.test_count.count()</span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">26445</span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">解决方法:</span>http://docs.mongodb.org/manual/reference/command/count/#behavior</p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">“On a sharded cluster,&nbsp;<code>count</code>&nbsp;can result in an&nbsp;<em>inaccurate</em>&nbsp;count if&nbsp;orphaned documents&nbsp;exist or if a&nbsp;chunk migration&nbsp;is in progress.</span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">To avoid these situations, on a sharded cluster, use the&nbsp;<code>$group</code>&nbsp;stage of the&nbsp;<code>db.collection.aggregate()</code>method to&nbsp;<code>$sum</code>&nbsp;the documents. ”</span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">31、自定义MongoDB操作函数</p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">可以把自己写的<span lang="EN-US">js代码保存在某个地方,让<span lang="EN-US">MongoDB加载它,然后就可以在<span lang="EN-US">MongoDB的命令行里操作它们。</span></span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">mongodb shell默认会加载~/.mongorc.js文件</span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">例如以下修改了启动提示文字、左侧提示文字,增加了my_show_shards shell函数用于显示当前sharded collection的chunks在各分片的负载情况:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//~/.mongorc.js<br>//</span><span style="color: rgba(0, 128, 0, 1)">show at begin</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> compliment = ["attractive", "intelligent", "like batman"<span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(0, 0, 255, 1)">var</span> index = Math.floor(Math.random()*3<span style="color: rgba(0, 0, 0, 1)">);
print(</span>"Hello, you're looking particularly " + compliment + " today!"<span style="color: rgba(0, 0, 0, 1)">);


</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">change the prompt</span>
prompt = <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(){
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">typeof</span> db == "undefined"<span style="color: rgba(0, 0, 0, 1)">) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> "(nodb)&gt; "<span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Check the last db operation</span>
    <span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
      db.runCommand({getLastError: </span>1<span style="color: rgba(0, 0, 0, 1)">});
    }
    </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (e) {
      print(e);
    }
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> db + "&gt; "<span style="color: rgba(0, 0, 0, 1)">;
}


</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">show all shard's chunks</span>
<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> my_show_shards() {
    </span><span style="color: rgba(0, 0, 255, 1)">var</span> config_db = db.getSiblingDB("config"<span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 0, 255, 1)">var</span> collections =<span style="color: rgba(0, 0, 0, 1)"> {};
    </span><span style="color: rgba(0, 0, 255, 1)">var</span> shards =<span style="color: rgba(0, 0, 0, 1)"> {};
    </span><span style="color: rgba(0, 0, 255, 1)">var</span> shard_it =<span style="color: rgba(0, 0, 0, 1)"> config_db.chunks.find().snapshot();

    </span><span style="color: rgba(0, 0, 255, 1)">while</span><span style="color: rgba(0, 0, 0, 1)"> (shard_it.hasNext()) {
      next_item </span>=<span style="color: rgba(0, 0, 0, 1)"> shard_it.next();
      collections).replace(/\"/g, "")] = 1<span style="color: rgba(0, 0, 0, 1)">;
      shards).replace(/\"/g, "")] = 1<span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 0, 255, 1)">var</span> list_collections =<span style="color: rgba(0, 0, 0, 1)"> [];
    </span><span style="color: rgba(0, 0, 255, 1)">var</span> list_shards =<span style="color: rgba(0, 0, 0, 1)"> [];
    </span><span style="color: rgba(0, 0, 255, 1)">for</span> (item <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> collections) {
      list_collections.push(item);
    }
    </span><span style="color: rgba(0, 0, 255, 1)">for</span> (item <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> shards) {
      list_shards.push(item);
    }

    list_collections.forEach(</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(collec) {
            list_shards.forEach(</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(item) {
                obj </span>=<span style="color: rgba(0, 0, 0, 1)"> {};
                obj[</span>"shard"] =<span style="color: rgba(0, 0, 0, 1)"> item;
                obj[</span>"ns"] =<span style="color: rgba(0, 0, 0, 1)"> collec;
                it </span>=<span style="color: rgba(0, 0, 0, 1)"> config_db.chunks.find(obj);
                print(collec, item, it.count());
                })
            })
}</span></pre>
</div>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">32、关闭mongod</p>
<p>mongo admin --port 17380 --eval "db.shutdownServer()"</p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">33、查看chunks信息</p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US">eg:&nbsp;进入到<span lang="EN-US">config db下,执行</span></span></span></p>
<div>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">db.chunks.find()</span></span></span></p>
</div>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">34、预分片参考</p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">http://blog.zawodny.com/2011/03/06/mongodb-pre-splitting-for-faster-data-loading-and-importing/</span></span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">35、DB重命名</p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">db.copyDatabase("xx_config_20141113", "xx_config")</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">use&nbsp;xx_config_20141113</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">db.dropDatabase();</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">远程拷贝<span lang="EN-US">DB :</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US">db.copyDatabase(fromdb, todb, fromhost, username, password)</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">db.copyDatabase("t_config", "t_config_v1", "xxxhost: 17380")</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">这个拷贝过程很慢。</span></p>
<p><strong><span style="font-family: &quot;Microsoft Yahei&quot;">注意,sharded的DB是无法拷贝的,所以sharded的DB也无法采用上面的方式重命名。</span></strong></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span lang="EN-US">参考:&nbsp;<span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">http://docs.objectrocket.com/features.html&nbsp; "</span>Your remote database is sharded through mongos."</span></span></span></span></span></span></p>
<div>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">拷贝collection:</span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">db.collection.copyTo("newcollection")&nbsp;</span></p>
同样,sharded的collection也无法拷贝。
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">36、聚合运算</p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">包括:</span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US">1、pipeline;</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US">2、<span lang="EN-US">map-reduce</span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">管道:</span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">http://docs.mongodb.org/manual/tutorial/aggregation-with-user-preference-data/</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">http://docs.mongodb.org/manual/reference/operator/aggregation/#aggregation-expression-operators</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">http://api.mongodb.org/python/current/api/pymongo/collection.html#pymongo.collection.Collection.aggregate</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US">2.6之前的<span lang="EN-US">MongoDB,管道不支持超过<span lang="EN-US">16MB的返回集合。</span></span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">可以使用<span lang="EN-US">$out操作符,把结果写入到<span lang="EN-US">collection中。如果<span lang="EN-US">aggregation成功,<span lang="EN-US">$out会替换已有的<span lang="EN-US">colleciton,但不会修改索引信息,如果失败,则什么都不做。</span></span></span></span></span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">http://docs.mongodb.org/manual/reference/operator/aggregation/out/#pipe._S_out</span></span></p>
<div>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">37、aggregate pipeline demo</p>
</div>
<span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;"><strong>demo1,基础:</strong></span></span>
<div>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">cswuyg_test&gt; db.cswuyg_test.aggregate({"$match": {"_": ISODate("2015-02-16"), "$or": [{"13098765": {"$exists": true}}, {"13123456": {"$exists": true}}]}}, {"$group": {"_id": "$_", "13098765": {"$sum": "$13098765"}, "13123456":{"$sum": "$13123456"}}})</span></p>
<p><strong><span style="font-family: &quot;Microsoft Yahei&quot;">demo2,使用磁盘:</span></strong></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">db.test.aggregate([{'$match': {'D': {'$nin': ['a', 'b', 'c']}, '_': {'$lte': ISODate("2015-02-27"), '$gte': ISODate("2015-02-26")}}}, {'$group': {'_id': {'a': '$a', 'b': '$b', 'D': '$D'}, 'value': {'$sum': 1}}}], {'allowDiskUse': true})</span></p>
</div>
<span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;"><strong><span lang="EN-US">demo3,指定输出文档:</span></strong></span></span>
<div>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">db.cswuyg.aggregate([ {'$match': {'D': {'$nin': ['a', 'b', 'c']}, '_': {'$lte': ISODate("2015-02-10"), '$gte': ISODate("2015-02-09")}}}, {'$group': {'_id': {'C': '$C', 'D': '$D'}, 'value': {'$sum': 1}}}, {"$out": "cswuyg_out"}], {'allowDiskUse':true})<br>db.b.aggregate([{$match: {a: {$size: 6}}}, {$group: {_id: {a: '$a'}}}, {$out: 'hh_col'}], {allowDiskUse: true})</span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">注:指定输出文档,只能输出到本DB下。</span></p>
<p><strong><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US">aggregate练习:</span></span></span></strong></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US">pymongo代码:</span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">[{'$match': {u'I': {u'$in': }, u'H': u'id', u'12345678': {u'$exists': True}, '_':{'$lte': datetime.datetime(2015, 6, 1, 23, 59, 59), '$gte': datetime.datetime(2015, 6, 1, 0, 0)}}}, {'$group': {'_id': {u'12345678': u'$12345678', u'G': u'$G'}, 'value': {'$sum': 1}}}]</span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;">shell下代码:</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">db.test.aggregate([{$match: {_:ISODate("2015-06-01"), "H": "id", "12345678": {"$exists": true}, "I": "XXX"}}, {$group: {_id: {"12345678": "$12345678", "G": "$G"}, "value": {"$sum": 1}}}], {allowDiskUse:true})</span></span></span></p>


































</div>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">38、修改Key:Value中的Value</p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">给字段B的值加上大括号'{':</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">db.test.find({_:ISODate("2014-11-02")}).forEach(function(item){if(/{.+}/.test(item["B"])){}else{print(item["B"]);db.test.update({"_id": item["_id"]}, {"$set": {"B": "{" + item["B"] + "}"}})}})</span></span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">39、修改primary shard</p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">db.runCommand({"movePrimary": "test", "to": "shard0000"})</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">这样子<span lang="EN-US">test DB 里的非<span lang="EN-US">sharded cocllection数据就会被存放到<span lang="EN-US">shard0000中,非空DB的话,可能会有一个<span lang="EN-US">migrate的过程。</span></span></span></span></span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">40、 mongodb默认开启autobalancer</p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">balancer是sharded集群的负载均衡工具,新建集群的时候默认开启,</span>除非你在<span lang="EN-US">config里把它关闭掉:</span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">config&gt; db.settings.find()</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">{ "_id" : "chunksize", "value" : 64 }</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">{ "_id" : "balancer", "activeWindow" : { "start" : "14:00", "stop" : "19:30" }, "stopped" : false}</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">activeWindow指定autobalancer执行均衡的时间窗口。</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">stopped说明是否使用autobalancer。</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">手动启动balancer:sh.startBalancer()</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">判断当前balancer是否在跑:sh.isBalancerRunning()</span></span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">41、MongoDB插入性能优化</p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">插入性能:</span><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US">200W的数据,在之前没有排序就直接插入,耗时<span lang="EN-US">4小时多,现在,做了排序,插入只需要<span lang="EN-US">5分钟。排序对于单机版本的<span lang="EN-US">MongoDB性能更佳,避免了随机插入引发的频繁随机<span lang="EN-US">IO。</span></span></span></span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">排序:在做分文件排序的时候,文件分得越小,排序越快,当然也不能小到<span lang="EN-US">1,否则频繁打开文件也耗费时间。</span></span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">42、MongoDB数组操作</p>














































</div>
<p>
<span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span lang="EN-US">1、更新<span lang="EN-US">/插入数据,不考虑重复值:</span></span></span></span></span></span></span></span></p>
<div>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">mongos&gt; db.test.update({"helo":"he2"}, {"$push": {"name":"b"}})</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">多次插入后结果:</span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">{ "_id" : ObjectId("54a7aa2be53662aebc28585f"), "helo" : "he2", "name" : [ "a", "b", "b" ] }</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US">2、更新<span lang="EN-US">/插入数据,保证不重复:</span></span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">mongos&gt; db.test.update({"helo":"she"}, {"$addToSet": {"name":"b"}})</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">多次插入后结果:</span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">{ "_id" : ObjectId("54dd6e1b570cb10de814f86d"), "helo" : "she", "name" : [ "b" ] }</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">保证只有一个值。</span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US">3、数组元素个数:</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US">$size&nbsp;用来指定数组的元素个数,显示fruit数组长度为3的document:</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">mongos&gt; db.a.find({"fruit": {$size: 3}})</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">{ "_id" : ObjectId("54b334798220cd3ad74db314"), "fruit" : [ "apple", "orange", "cherry" ] }</span></span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">43、更换Key: Value中的Key</p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US">verRelease&nbsp;换为<span lang="EN-US">&nbsp;TEST</span></span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">db.test.find().forEach(function(item){db.test.update({_id:item["_id"]}, {"$set": {"TEST": item["verRelease"]}}, {"$unset":{"verRelease":{"exists":true}}})})</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">或者更新部分修改为:</span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">db.test.update({D : &nbsp;ISODate("2014-11-02")}, {$rename : &nbsp;{"AcT": "AM"}}, false, true)</span></span></p>

































</div>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">44、手动在shell下moveChunk</p>
<div>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">config&gt; sh.moveChunk("xx.yy", { "_id" : { "D" : ISODate("2015-02-24T00:00:00Z"), "id" : "3f" } }, "shard0003")</span></span></p>
<p>如果出现错误,参考这里:可能需要重启&nbsp;</p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">http://stackoverflow.com/questions/26640861/movechunk-failed-to-engage-to-shard-in-the-data-transfer-cant-accept-new-chunk</span></span></p>

































</div>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">45、MongoDB升级后的兼容问题</p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US">MongoDB 2.4切换到<span lang="EN-US">2.6之后,出现数据没有插入,pymongo代码:</span></span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">&nbsp;update_obj = {"$set" : &nbsp;{"a": 1}}</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">&nbsp;update_obj["$inc"] = inc_objs</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">&nbsp;update_obj["$push"] = list_objs</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">&nbsp;db.test.update({"_id": id}, update_obj, True)</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US">2.6里,<span lang="EN-US">inc如果是空的,则会导致整条日志没有插入,<span lang="EN-US">2.4则<span lang="EN-US">inc为空也可以正常运行。</span></span></span></span></span></p>
<div>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">46、格式化json显示</p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">db.collection.find().pretty()</span></span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">47、更新replica集群的域名信息</p>
<div class="cnblogs_code">
<pre>cfg =<span style="color: rgba(0, 0, 0, 1)"> rs.conf()
cfg.members[</span>0].host = "xxxhost: 20000"<span style="color: rgba(0, 0, 0, 1)">
cfg.members[</span>1].host = "yyyhost: 20001"<span style="color: rgba(0, 0, 0, 1)">
cfg.members[</span>2].host = "zzzhost: 20002"<span style="color: rgba(0, 0, 0, 1)">
rs.reconfig(cfg)</span></pre>
</div>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">48、不要直接修改local.system.replset</p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">不要直接修改local.system.replset,因为他只能修改本机器的本地信息。</span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">但是如果出现了:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"> {
      </span>"errmsg" : "exception: can't use localhost in repl set member names except when using it for all members"<span style="color: rgba(0, 0, 0, 1)">,
      </span>"code" : 13393<span style="color: rgba(0, 0, 0, 1)">,
      </span>"ok" : 0<span style="color: rgba(0, 0, 0, 1)">
}</span></pre>
</div>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">这样的错误,那就要修改本机的<span lang="EN-US">local.system.replset,然后重启。</span></span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">49、排重统计</p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">(1)aggregate</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">&nbsp;result = db.flu_test.aggregate([{$match: {_: ISODate("2015-05-01")}}, {$group:{_id:"$F", value: {$sum:1}}}], {allowDiskUse:true})</span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US">&nbsp;<span lang="EN-US"><span lang="EN-US">result.itcount()</span></span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US">(2)distinct</span></span></p>
flu_test&gt; db.flu_test.distinct('F', {_:ISODate("2015-06-22")})</div>
<div>但是,由于distinct将结果保存在list中,所以很容易触发文档超过16MB的错误:</div>
<div>2015-06-23T15:31:34.479+0800 distinct failed: {</div>
<div>&nbsp; &nbsp;"errmsg" : "exception: distinct too big, 16mb cap",</div>
<div>&nbsp; &nbsp;"code" : 17217,</div>
<div>&nbsp; &nbsp;"ok" : 0</div>
<div>} at src/mongo/shell/collection.js:1108
<p><span style="font-family: &quot;Microsoft Yahei&quot;">非排重文档量统计:</span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">mongos&gt; count = db.flu_test.aggregate([{$match:{_:ISODate("2015-05-21")}}, {$group:{_id:null, value: {$sum:1}}}], {allowDiskUse:true})</span></span></p>
<p><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">{ "_id" : null, "value" : 3338987 }</span></span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">50、pymongo优先读取副本集Secondary节点</p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;; color: rgba(255, 0, 0, 1)">优先读取副本集Secondary节点,可以减少primary节点负担,在primary节点跟secondary节点同步延迟较短、业务对数据不要求实时一致时可以利用副本集做读写分离和负载均衡。</span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">副本集集群的读取有这几种使用方式:</span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US">primary:&nbsp;</span>默认参数,只从主节点读取;<span lang="EN-US"><br><span lang="EN-US">primaryPreferred:&nbsp;</span>大部分从主节点上读取,主节点不可用时从S<span lang="EN-US">econdary节点读取;<span lang="EN-US"><br><span lang="EN-US">secondary:&nbsp;</span>只从S<span lang="EN-US">econdary节点上进行读取操作;<span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><br><span lang="EN-US"><strong>secondaryPreferred</strong>:&nbsp;</span>优先从S<span lang="EN-US">econdary节点读取,S<span lang="EN-US">econdary节点不可用时从主节点读取;<span lang="EN-US"><br><span lang="EN-US">nearest:&nbsp;</span><span lang="EN-US">从网络延迟最低的节点上读取。</span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">(1)测试<span lang="EN-US">1&nbsp;优先从<span lang="EN-US">secondary读取数据<span lang="EN-US">:</span></span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> pymongo


client </span>= pymongo.MongoReplicaSetClient(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">xxxhost: yyyport</span><span style="color: rgba(128, 0, 0, 1)">'</span>,replicaSet=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">my_set</span><span style="color: rgba(128, 0, 0, 1)">'</span>, readPreference=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">secondaryPreferred</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">print</span><span style="color: rgba(0, 0, 0, 1)"> client.read_preference# 显示当前的读取设定
</span><span style="color: rgba(0, 0, 255, 1)">for</span> i <span style="color: rgba(0, 0, 255, 1)">in</span> xrange(1, 10000):<span style="color: rgba(0, 128, 0, 1)"># </span><span style="color: rgba(0, 128, 0, 1)">循环10000次,用mongostat观察查询负载</span>
    a = client[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">history</span><span style="color: rgba(128, 0, 0, 1)">'</span>][<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">20140409</span><span style="color: rgba(128, 0, 0, 1)">'</span>].find_one({<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ver_code</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">128</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">})
    </span><span style="color: rgba(0, 0, 255, 1)">print</span> a</pre>
</div>
<p><span style="font-family: &quot;Microsoft Yahei&quot;">(2)测试<span lang="EN-US">2 直接连接某S<span lang="EN-US">econdary节点读取数据:</span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> pymongo


client </span>= pymongo.MongoClient(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">xxxhost</span><span style="color: rgba(128, 0, 0, 1)">'</span>, yyyport, slaveOk=<span style="color: rgba(0, 0, 0, 1)">True)
a </span>= client[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">msgdc_ip</span><span style="color: rgba(128, 0, 0, 1)">'</span>][<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">query_ip</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">].find().count()
</span><span style="color: rgba(0, 0, 255, 1)">print</span> a</pre>
</div>
</div>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span lang="EN-US">参考:</span></span></span></span></span></span></span></span></p>
<div>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">http://www.lanceyan.com/category/tech/mongodb</span><span style="font-family: &quot;Microsoft Yahei&quot;"><br>http://emptysqua.re/blog/reading-from-mongodb-replica-sets-with-pymongo/</span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">http://api.mongodb.org/python/current/api/pymongo/read_preferences.html#module-pymongo.read_preferences</span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US"><span style="font-family: &quot;Microsoft Yahei&quot;">http://api.mongodb.org/python/current/api/pymongo/mongo_client.html#pymongo.mongo_client.MongoClient</span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;">注意:<span lang="EN-US">3.0之后<span lang="EN-US">MongoReplicaSetClient函数是要被放弃的。</span></span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;">但是测试时发现:在较低版本中,需要使用<span lang="EN-US">MongoReplicaSetClient,<span lang="EN-US">MongoClient无法实现<span lang="EN-US">&nbsp;pymongo.ReadPreference.SECONDARY_PREFERRED功能。</span></span></span></span></span></p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US"><span lang="EN-US"><span lang="EN-US">2015.12.28补充:</span></span></span></span></span></p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">51、为副本集设置标签</p>
<p>可以为副本集中的每个成员设置tag(标签),设置标签的好处是后面读数据时,应用可以指定从某类标签的副本上读数据。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">为replica 设置tag<br>在副本shell下执行:
var conf </span>=<span style="color: rgba(0, 0, 0, 1)"> rs.conf()
conf.members[</span>0].tags = { "location": "beijing"<span style="color: rgba(0, 0, 0, 1)"> }
conf.members[</span>1].tags = { "location": "hangzhou"<span style="color: rgba(0, 0, 0, 1)">}
conf.members[</span>2].tags = { "location": "guangzhou"<span style="color: rgba(0, 0, 0, 1)">}
rs.reconfig(conf)</span></pre>
</div>
<p>&nbsp;参考:https://docs.mongodb.org/v3.0/tutorial/configure-replica-set-tag-sets/&nbsp;</p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">52、副本集碎片整理的一种方法</p>
<p>使用MMAPv1存储引擎时,对于频繁大数据量的写入删除操作,碎片问题会变得很严重。在数据同步耗时不严重的情况下,我们不需要对每个副本做repair,而是轮流“卸下副本,删除对应的磁盘文件,重新挂上副本”。每个重新挂上的副本都会自动去重新同步一遍数据,碎片问题就解决了。</p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">53、存储引擎升级为wiredTiger</p>
<p>我们当前的版本是MongoDB3.0.6,没有开启wiredTiger引擎,现在打算升级到wiredTiger引擎。</p>
<p>我们是Shared Cluster,shard是Replica Set。升级比较简单,只需要逐步对每一个副本都执行存储引擎升级即可,不影响线上服务。</p>
<p>升级时,只在启动命令中添加:--storageEngine&nbsp;wiredTiger。</p>
<p><strong>步骤</strong>:首先,下掉一个副本;然后,把副本的磁盘文件删除掉;接着,在该副本的启动命令中添加--storageEngine&nbsp;wiredTiger后启动。这就升级完一个副本,等副本数据同步完成之后,其它副本也照样操作(或者处理完一个副本之后,拷贝该副本磁盘文件替换掉另一个副本的磁盘文件)。<strong>风险:如果数据量巨大,且有建索引的需求,容易出现内存用尽。</strong></p>
<p>分片集群的configure server可以不升级。</p>
<p>升级之后磁盘存储优化效果极度明显,22GB的数据会被精简到1.3GB。</p>
<p>升级后的磁盘文件完全变了,所以不同存储引擎下的磁盘文件不能混用。</p>
<p>升级参考:https://docs.mongodb.org/manual/tutorial/change-sharded-cluster-wiredtiger/</p>
<p style="background: rgba(128, 128, 128, 1); font-size: 18pt; color: rgba(255, 255, 255, 1)">54、oplogSizeMB不要设置得太大</p>
<p>启动配置中的这个字段是为了设置oplog collection的大小,oplog是操作记录,它是一个capped collection,在副本集群中,设置得太小可能导致secondary无法及时从primary同步数据。默认情况下是磁盘大小的5%。但是,如果这个字段设置得太大,可能导致暴内存,oplog的数据几乎是完全加载在内存中,一旦太大,必然暴内存,导致OOM。而且因为这个collection是capped,MongoDB启动之后无法修改其大小。</p>
<p><span style="font-family: &quot;Microsoft Yahei&quot;"><span style="font-family: &quot;Microsoft Yahei&quot;"><span lang="EN-US"><span lang="EN-US"><span lang="EN-US">本文所在:http://www.cnblogs.com/cswuyg/p/4595799.html&nbsp;</span></span></span></span></span></p>
</div><br><br>
来源:https://www.cnblogs.com/cswuyg/p/4595799.html
頁: [1]
查看完整版本: MongoDB使用小结:一些常用操作分享