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

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

本文整理了一年多以来我常用的MongoDB操作,涉及mongo-shell、pymongo,既有运维层面也有应用层面,内容有浅有深,这也就是我从零到熟练的历程。

MongoDB的使用之前也分享过一篇,稍微高阶点:见这里:《MongoDB使用小结》

1、shell登陆和显示

假设在本机上有一个端口为17380的MongoDB服务,假设已经把mongo bin文件加入到系统PATH下。

登陆:mongo --port 17380       

显示DB:show dbs

进入某DB:use test_cswuyg

显示集合:show tables

2、简单查找

查找文档:db.test_mac_id.find({'a':  'b'})

删除文档:db.test_mac_id.remove({'a': 'b'})

查找找到某一天的数据:

db.a.find({'D' :  ISODate('2014-04-21T00:00:00Z')}) 或者 db.a.find({'D' :  ISODate('2014-04-21')})

删除某一天的数据:

db.region_mac_id_result.remove({"D" :  ISODate('2014-04-17')})

小于2014.6.5的数据:

db.xxx.find({E: {$lt :ISODate('2014-06-05')}})

大于等于2014.6.1的数据:

db.xxx.find({E: {$gte: ISODate("2014-05-29")}}).count()

两个条件:

db.xxx.find({E:{$gte: ISODate("2014-05-29"), $lte: ISODate("2014-06-04")}}).count()

json中的嵌套对象查询,采用“点”的方式:

mongos> db.wyg.find({"a.b": {$exists: true}})

{ "_id" : "c", "a" : { "b" : 10 } }

某个字段存在,且小于1000有多少:

db.stat.find({_:  ISODate("2014-06-17"), "123": {$exists: 1, $lte: 1000}}, {"123": 1}).count()

3、存在和遍历统计

存在'i': 1,且存在old_id字段:

mongos> var it = db.test.find({'i': 1, "old_id": {$exists: 1}})

遍历计数1:mongos> var count = 0;while(it.hasNext()){if (it.next()["X"].length==32)++count}print(count)

遍历计数2:mongos> var count = 0;while(it.hasNext()){var item = it.next(); if (item['X'].length==32 && item['_id'] != item['X'])++count;if(!item['X'])++count;}print(count)

4、插入和更新

> db.test.findOne({_id:  'cswuyg'})

null

> db.test.insert({'_id': 'cswuyg', 'super_admin': true})

> db.test.findOne({'_id': 'cswuyg'})

{

        "_id" : "cswuyg",

        "super_admin" : true

}

db.test.update({'_id': 'cswuyg'}, {$set: {'super_admin': true}})

5、repair 操作

对某个DB执行repair:进入要repair的db,执行db.repairDatabase()

对mongodb整个实例执行repair:numactl --interleave=all /mongod --repair --dbpath=/home/disk1/mongodata/shard/ 

6、mongodb任务操作

停止某个操作:

 

复制代码

[xxx]$ mongo --port 17380 MongoDB shell version: 2.4.5 connecting to: 127.0.0.1:17380/test mongos> db.currentOp() { "inprog" : [ ...] } mongos> db.killOp("shard0001:163415563")

复制代码

 

批量停止:

db.currentOp().inprog.forEach(function(item){db.killOp(item.opid)})

当查询超过1000秒的,停止:

db.currentOp().inprog.forEach(function(item){if(item.secs_running > 1000 )db.killOp(item.opid)})

停止某个数据源的查询:

db.currentOp().inprog.forEach(function(item){if(item.ns == "cswuyg.cswuyg")db.killOp(item.opid)})

把所有在等待锁的操作显示出来:

db.currentOp().inprog.forEach(function(item){if(item.waitingForLock)print(JSON.stringify(item))})

把处于等待中的分片显示出来:

db.currentOp().inprog.forEach(function(item){if(item.waitingForLock){print(item.opid.substr(0,9));print(item.op);}})

把非等待的分片显示出来:

db.currentOp().inprog.forEach(function(item){if(!item.waitingForLock){var lock_info = item["opid"];print(lock_info.substr(0,9));print(item["op"]);}})

查找所有的查询任务:

db.currentOp().inprog.forEach(function(item){if(item.op=="query"){print(item.opid);}})

查找所有的非查询任务:

db.currentOp().inprog.forEach(function(item){if(item.op!="query"){print(item.opid);}})

查找所有的操作:

db.currentOp().inprog.forEach(function(item){print(item.op, item.opid);});

常用js脚本,可直接复制到mongo-shell下使用:

显示当前所有的任务状态:

print("##########");db.currentOp().inprog.forEach(function(item){if(item.waitingForLock){var lock_info = item["opid"];print("waiting:",lock_info,item.op,item.ns);}});print("----");db.currentOp().inprog.forEach(function(item){if(!item.waitingForLock){var lock_info = item["opid"];print("doing",lock_info,item.op,item.ns);}});print("##########");

杀掉某些特定任务:

(1)

db.currentOp().inprog.forEach(function(item){if(item.waitingForLock){var lock_info = item["opid"];if(item.op=="query" && item.secs_running >60 && item.ns=="cswuyg.cswuyg"){db.killOp(item.opid)}}})

(2)

复制代码

db.currentOp().inprog.forEach(function(item) {  var lock_info = item["opid"];  if (item.op == "query" && item.secs_running > 1000) {   print("kill", item.opid);   db.killOp(item.opid)  } })

复制代码

7、删除并返回数据

old_item = db.swuyg.findAndModify({query: {"_id": "aabbccdd"}, fields:{"D": 1,'E':1, 'F':1}, remove: true})

fields里面为1的是要返回的数据。

8、分布式集群部署情况

(1) 细致到collection的显示:sh.status()

(2)仅显示分片:

use config; db.shards.find()

        { "_id" : "shard0000", "host" : "xxhost:10001" }

        { "_id" : "shard0001", "host" : "yyhost:10002" }

        ....

(3)

use admin

db.runCommand({listshards: 1})

列出所有的shard server

9、正则表达式查找

正则表达式查询:
mongos> db.a.find({"tt": /t*/i})
{ "_id" : ObjectId("54b21e0f570cb10de814f86b"), "aa" : "1", "tt" : "tt" }
其中i表明是否是case-insensitive,有i则表示忽略大小写

db.testing.find({"name":/[7-9]/})

当name的值为789这几个数字组成的字符串时,查询命中。

10、查询性能

db.testing.find({name: 123}).explain()

输出结果:

复制代码

{         "cursor" : "BasicCursor",         "isMultiKey" : false,         "n" : 1,         "nscannedObjects" : 10,         "nscanned" : 10,         "nscannedObjectsAllPlans" : 10,         "nscannedAllPlans" : 10,         "scanAndOrder" : false,         "indexOnly" : false,         "nYields" : 0,         "nChunkSkips" : 0,         "millis" : 0,         "indexBounds" : {         },         "server" : "xxx:10001" }

复制代码

11、更新或插入

当该key不存在的时候执行插入操作,当存在的时候则不管,可以使用setOnInsert

db.wyg.update({'_id': 'id'}, {'$setOnInsert': {'a': 'a'}, '$set': {'b': 'b'}}, true)

当id存在的时候,忽略setOnInsert。

当id存在的时候,如果要插入,则插入{'a': 'a'}

最后的参数true,则是指明,当update不存在的_id时,执行插入操作。默认是false,只更新,不插入。

push、setOnInsert:db.cswuyg.update({"_id": "abc"}, {$push: {"name": "c"}, $setOnInsert: {"cc":"xx"}}, true)

12、计算DB中collection的数量

db.system.namespaces.count()

13、增加数字,采用$inc

db.cswuyg.update({"a.b": {$exists: true}}, {$inc: {'a.b': 2}})

也就是对象a.b的值,增加了2

注意$inc只能用于数值。

14、删除某个key

db.cswuyg.update({'_id': 'c'}, {$unset: {'b': {$exists: true}}})

{ "_id" : "c", "a" : { "b" : 12 }, "b" : 7 } 

转变为:

{ "_id" : "c", "a" : { "b" : 12 } }

15、增加key:value

db.cswuyg.update({'_id': 'z'}, {'$set': {'hello': 'z'}})

{ "_id" : "z", "b" : 1 }

转变为:

{ "_id" : "z", "b" : 1, "hello" : "z" }

16、删除数据库、删除表

删除数据库:db.dropDatabase();

删除表:db.mytable.drop();

17、查找到数据只看某列

只显示key名为D的数据:db.test.find({}, {D: 1})

18、查看分片存储情况

(1)所有DB的分片存储信息,包括chunks数、shard key信息:db.printShardingStatus()

(2)db.collectiob.getShardDistribution() 获取collection各个分片的数据存储情况

(3)sh.status() 显示本mongos集群所有DB的信息, 包含了Shard Key信息

19、查看collection的索引

db.cswuyg.getIndexes()

20、开启某collection的分片功能

1. ./bin/mongo –port 20000

2. mongos> use admin

3. switched to db admin

4. mongos> db.runCommand({'enablesharding"' 'test'})

5. { "ok" : 1 }

开启user collection分片功能:

1. mongos> db.runCommand({'shardcollection': 'test.user', 'key': {'_id': 1}})

{ "collectionsharded" : "test.user", "ok" : 1 }

21、判断当前是否是shard集群

isdbgrid:用来确认当前是否是 Sharding Cluster

复制代码

> db.runCommand({isdbgrid:1}); 是: { "isdbgrid" : 1, "hostname" : "xxxhost", "ok" : 1 } 不是: {         "ok" : 0,         "errmsg" : "no such cmd: isdbgrid",         "code" : 59,         "bad cmd" : {                 "isdbgrid" : 1         } }

复制代码

22、$addToSet、$each插入数组数据

mongos> db.cswuyg.find()

{ "_id" : "wyg", "a" : "c", "add" : [ "a", "b" ] }

mongos> db.cswuyg.update({"_id": "wyg"}, {"$set": {"a": "c"}, "$addToSet": {"add": {"$each" :["a", "c"]}}}, true)

mongos> db.cswuyg.find()

{ "_id" : "wyg", "a" : "c", "add" : [ "a", "b", "c" ] }

$each是为了实现list中的每个元素都插入,如果没有$each,则会把整个list作为一个元素插入,变成了2维数组。

 $addToSet会判断集合是否需要排重,保证集合不重。$push可以对数组添加元素,但它只是直接插入数据,不做排重。

eg:db.test.update({"a": 1}, {$push: {"name": {$each:["a", "c"]}}})
eg:db.test.update({"a": 1}, {$addToSet: {"name": {$each: ["a", "d"]}}})

不去重插入 pushAll

> db.push.insert({"a": "b", "c": ["c", "d"]})

> db.push.find()

{ "_id" : ObjectId("53e4be775fdf37629312b96c"), "a" : "b", "c" : [ "c", "d" ]

}

> db.push.update({"a":"b"}, {$pushAll:{"c": ["z", "d"]}})

> db.push.find()

{ "_id" : ObjectId("53e4be775fdf37629312b96c"), "a" : "b", "c" : [ "c", "d",

"z", "d" ] }

pushAll跟push类似,不同的是pushAll可以一次插入多个value,而不需要使用$each。

23、刷新配置信息

 db.runCommand("flushRouterConfig");

24、批量更新

db.xxx.update({"_id": {$exists: 1}}, {$set: {"_" :  ISODate("2014-03-21T00: 00:00Z")}}, true, true)

最后一个参数表示是否要批量更新,如果不指定,则一次只更新一个document。

25、dump DB

mongodump支持从DB磁盘文件、运行中的MongoD服务中dump出bson数据文件。

(1)关闭MongoD之后,从它的DB磁盘文件中dump出数据:

mongodump  --dbpath=/home/disk1/mongodata/shard/ -d cswuyg -o /home/disk2/mongodata/shard

参考:

http://docs.mongodb.org/manual/reference/program/mongodump/

http://stackoverflow.com/questions/5191186/how-do-i-dump-data-for-a-given-date

(2)从运行的MongoD中导出指定日期数据,采用-q查询参数:

 mongodump -h xxxhost --port 17380 --db cswuyg --collection test -q "{D: {\$gte: {\$date: `date -d "20140410" +%s`000}, \$lt: {\$date: `date +%s`000}}}" 

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}}}"

dump出来的bson文件去掉了索引、碎片空间,所有相比DB磁盘文件要小很多。

26、restore DB

restore的时候,不能先建索引,必须是restore完数据之后再建索引,否则restore的时候会非常慢。而且一般不需要自己手动建索引,在数据bson文件的同目录下有一个索引bson文件(system.indexes.bson),restore完数据之后会mongorestore自动根据该文件创建索引。

(1)从某个文件restore

mongorestore --host xxxhost --port 17380 --db cswuyg --collection cswuyg ./cswuyg_1406330331/cswuyg/cswuyg_bak.bson

(2)从目录restore

./mongorestore --port 27018 /home/disk2/mongodata/shard/

(3)dump 和 restore configure server:

 mongodump --host xxxhost --port 19913 --db config  -o /home/work/cswuyg/test/config

 mongorestore --host  xxxhost --port 19914  /home/work/cswuyg/test/config

27、创建索引

复制代码

mongos> db.test.getIndexes() [         {                 "v" : 1,                 "key" : {                         "_id" : 1                 },                 "ns" : "cswuyg.test",                 "name" : "_id_"         } ] mongos> db.test.ensureIndex({"index": 1}) mongos> db.test.getIndexes() [         {                 "v" : 1,                 "key" : {                         "_id" : 1                 },                 "ns" : "cswuyg.test",                 "name" : "_id_"         },         {                 "v" : 1,                 "key" : {                         "index" : 1                 },                 "ns" : "cswuyg.test",                 "name" : "index_1"         } ]

复制代码

创建索引,并指定过期时间:db.a.ensureIndex({'_':-1}, {expireAfterSeconds: 1000})    1000Second.

修改过期时间: db.runCommand({"collMod": "a",  index: {keyPattern:{"_": -1}, expireAfterSeconds: 60}})

28、删除索引

db.post.dropIndexes() 删除post上所有索引

db.post.dropIndex({name: 1}) 删除指定的单个索引

29、唯一索引问题

如果集群在_id上进行了分片,则无法再在其他字段上建立唯一索引:

复制代码

mongos> db.a.ensureIndex({'b': 1}, {'unique': true}) {         "raw" : {                 "set_a/xxxhost:20001,yyyhost:20002" : {                         "createdCollectionAutomatically" : false,                         "numIndexesBefore" : 1,                         "ok" : 0,                         "errmsg" : "cannot create unique index over { b: 1.0 } with shard key pattern { _id: 1.0 }",                         "code" : 67                 },                 "set_b/xxxhost:30001,yyyhost:30002" : {                         "createdCollectionAutomatically" : false,                         "numIndexesBefore" : 1,                         "ok" : 0,                         "errmsg" : "cannot create unique index over { b: 1.0 } with shard key pattern { _id: 1.0 }",                         "code" : 67                 }         },         "code" : 67,         "ok" : 0,         "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 }\" }" }

复制代码

之所以出现这个错误是因为MongoDB无法保证集群中除了片键以外其他字段的唯一性,能保证片键的唯一性是因为文档根据片键进行切分,一个特定的文档只属于一个分片,MongoDB只要保证它在那个分片上唯一就在整个集群中唯一,实现分片集群上的文档唯一性一种方法是在创建片键的时候指定它的唯一性。

30、因迁移导致出现count得到的数字是真实数字的两倍

cswuyg> db.test.find({D: ISODate('2015-08-31'), B: 'active'}).count()

52118

cswuyg> db.test.find({D: ISODate('2015-08-31'), B: 'active'}).forEach(function(item){db.test_count.insert(item)})

cswuyg> db.test_count.count()

26445

解决方法:http://docs.mongodb.org/manual/reference/command/count/#behavior

“On a sharded cluster, count can result in an inaccurate count if orphaned documents exist or if a chunk migration is in progress.

To avoid these situations, on a sharded cluster, use the $group stage of the db.collection.aggregate()method to $sum the documents. ”

31、自定义MongoDB操作函数

可以把自己写的js代码保存在某个地方,让MongoDB加载它,然后就可以在MongoDB的命令行里操作它们。

mongodb shell默认会加载~/.mongorc.js文件

例如以下修改了启动提示文字、左侧提示文字,增加了my_show_shards shell函数用于显示当前sharded collection的chunks在各分片的负载情况:

复制代码

  compliment = ["attractive", "intelligent", "like batman"];  index = Math.floor(Math.random()*3); print("Hello, you're looking particularly " + compliment[index] + " today!");  prompt = (){      ( db == "undefined") {          "(nodb)> ";     }           {         db.runCommand({getLastError: 1});     }      (e) {         print(e);     }      db + "> "; }   my_show_shards() {      config_db = db.getSiblingDB("config");      collections = {};      shards = {};      shard_it = config_db.chunks.find().snapshot();      (shard_it.hasNext()) {         next_item = shard_it.next();         collections[JSON.stringify(next_item["ns"]).replace(/\"/g, "")] = 1;         shards[JSON.stringify(next_item["shard"]).replace(/\"/g, "")] = 1;     }      list_collections = [];      list_shards = [];      (item  collections) {         list_collections.push(item);     }      (item  shards) {         list_shards.push(item);     }     list_collections.forEach((collec) {             list_shards.forEach((item) {                 obj = {};                 obj["shard"] = item;                 obj["ns"] = collec;                 it = config_db.chunks.find(obj);                 print(collec, item, it.count());                 })             }) }

复制代码

32、关闭mongod

mongo admin --port 17380 --eval "db.shutdownServer()"

33、查看chunks信息

eg: 进入到config db下,执行

db.chunks.find()

34、预分片参考

http://blog.zawodny.com/2011/03/06/mongodb-pre-splitting-for-faster-data-loading-and-importing/

35、DB重命名

db.copyDatabase("xx_config_20141113", "xx_config")

use xx_config_20141113

db.dropDatabase();

远程拷贝DB :

db.copyDatabase(fromdb, todb, fromhost, username, password)

db.copyDatabase("t_config", "t_config_v1", "xxxhost: 17380")

这个拷贝过程很慢。

注意,sharded的DB是无法拷贝的,所以sharded的DB也无法采用上面的方式重命名。

参考: http://docs.objectrocket.com/features.html  "Your remote database is sharded through mongos."

拷贝collection:

db.collection.copyTo("newcollection") 

同样,sharded的collection也无法拷贝。

36、聚合运算

包括:

1、pipeline;

2、map-reduce

管道:

http://docs.mongodb.org/manual/tutorial/aggregation-with-user-preference-data/

http://docs.mongodb.org/manual/reference/operator/aggregation/#aggregation-expression-operators

http://api.mongodb.org/python/current/api/pymongo/collection.html#pymongo.collection.Collection.aggregate

2.6之前的MongoDB,管道不支持超过16MB的返回集合。

可以使用$out操作符,把结果写入到collection中。如果aggregation成功,$out会替换已有的colleciton,但不会修改索引信息,如果失败,则什么都不做。

http://docs.mongodb.org/manual/reference/operator/aggregation/out/#pipe._S_out

37、aggregate pipeline demo

demo1,基础:

cswuyg_test> db.cswuyg_test.aggregate({"$match": {"_": ISODate("2015-02-16"), "$or": [{"13098765": {"$exists": true}}, {"13123456": {"$exists": true}}]}}, {"$group": {"_id": "$_", "13098765": {"$sum": "$13098765"}, "13123456":{"$sum": "$13123456"}}})

demo2,使用磁盘:

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})

demo3,指定输出文档:

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})
db.b.aggregate([{$match: {a: {$size: 6}}}, {$group: {_id: {a: '$a'}}}, {$out: 'hh_col'}], {allowDiskUse: true})

注:指定输出文档,只能输出到本DB下。

aggregate练习:

pymongo代码:

[{'$match': {u'I': {u'$in': [XXX']}, 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}}}]

shell下代码:

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})

38、修改Key:Value中的Value

给字段B的值加上大括号'{':

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"] + "}"}})}})

39、修改primary shard

db.runCommand({"movePrimary": "test", "to": "shard0000"})

这样子test DB 里的非sharded cocllection数据就会被存放到shard0000中,非空DB的话,可能会有一个migrate的过程。

40、 mongodb默认开启autobalancer

balancer是sharded集群的负载均衡工具,新建集群的时候默认开启,除非你在config里把它关闭掉:

config> db.settings.find()

{ "_id" : "chunksize", "value" : 64 }

{ "_id" : "balancer", "activeWindow" : { "start" : "14:00", "stop" : "19:30" }, "stopped" : false}

activeWindow指定autobalancer执行均衡的时间窗口。

stopped说明是否使用autobalancer。

手动启动balancer:sh.startBalancer()

判断当前balancer是否在跑:sh.isBalancerRunning()

41、MongoDB插入性能优化

插入性能:200W的数据,在之前没有排序就直接插入,耗时4小时多,现在,做了排序,插入只需要5分钟。排序对于单机版本的MongoDB性能更佳,避免了随机插入引发的频繁随机IO。

排序:在做分文件排序的时候,文件分得越小,排序越快,当然也不能小到1,否则频繁打开文件也耗费时间。

42、MongoDB数组操作

1、更新/插入数据,不考虑重复值:

mongos> db.test.update({"helo":"he2"}, {"$push": {"name":"b"}})

多次插入后结果:

{ "_id" : ObjectId("54a7aa2be53662aebc28585f"), "helo" : "he2", "name" : [ "a", "b", "b" ] }

2、更新/插入数据,保证不重复:

mongos> db.test.update({"helo":"she"}, {"$addToSet": {"name":"b"}})

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })

多次插入后结果:

{ "_id" : ObjectId("54dd6e1b570cb10de814f86d"), "helo" : "she", "name" : [ "b" ] }

保证只有一个值。

3、数组元素个数:

$size 用来指定数组的元素个数,显示fruit数组长度为3的document:

mongos> db.a.find({"fruit": {$size: 3}})

{ "_id" : ObjectId("54b334798220cd3ad74db314"), "fruit" : [ "apple", "orange", "cherry" ] }

43、更换Key: Value中的Key

verRelease 换为 TEST

db.test.find().forEach(function(item){db.test.update({_id:item["_id"]}, {"$set": {"TEST": item["verRelease"]}}, {"$unset":{"verRelease":{"exists":true}}})})

或者更新部分修改为:

db.test.update({D :  ISODate("2014-11-02")}, {$rename :  {"AcT": "AM"}}, false, true)

44、手动在shell下moveChunk

config> sh.moveChunk("xx.yy", { "_id" : { "D" : ISODate("2015-02-24T00:00:00Z"), "id" : "3f" } }, "shard0003")

如果出现错误,参考这里:可能需要重启 

http://stackoverflow.com/questions/26640861/movechunk-failed-to-engage-to-shard-in-the-data-transfer-cant-accept-new-chunk

45、MongoDB升级后的兼容问题

MongoDB 2.4切换到2.6之后,出现数据没有插入,pymongo代码:

 update_obj = {"$set" :  {"a": 1}}

 update_obj["$inc"] = inc_objs

 update_obj["$push"] = list_objs

 db.test.update({"_id": id}, update_obj, True)

2.6里,inc如果是空的,则会导致整条日志没有插入,2.4则inc为空也可以正常运行。

46、格式化json显示

db.collection.find().pretty()

47、更新replica集群的域名信息

cfg = rs.conf() cfg.members[0].host = "xxxhost: 20000" cfg.members[1].host = "yyyhost: 20001" cfg.members[2].host = "zzzhost: 20002" rs.reconfig(cfg)

48、不要直接修改local.system.replset

不要直接修改local.system.replset,因为他只能修改本机器的本地信息。

但是如果出现了:

 {         "errmsg" : "exception: can't use localhost in repl set member names except when using it for all members",         "code" : 13393,         "ok" : 0  }

这样的错误,那就要修改本机的local.system.replset,然后重启。

49、排重统计

(1)aggregate

 result = db.flu_test.aggregate([{$match: {_: ISODate("2015-05-01")}}, {$group:{_id:"$F", value: {$sum:1}}}], {allowDiskUse:true})

 result.itcount()

(2)distinct

flu_test> db.flu_test.distinct('F', {_:ISODate("2015-06-22")})但是,由于distinct将结果保存在list中,所以很容易触发文档超过16MB的错误:2015-06-23T15:31:34.479+0800 distinct failed: {   "errmsg" : "exception: distinct too big, 16mb cap",   "code" : 17217,   "ok" : 0} at src/mongo/shell/collection.js:1108

非排重文档量统计:

mongos> count = db.flu_test.aggregate([{$match:{_:ISODate("2015-05-21")}}, {$group:{_id:null, value: {$sum:1}}}], {allowDiskUse:true})

{ "_id" : null, "value" : 3338987 }

50、pymongo优先读取副本集Secondary节点

优先读取副本集Secondary节点,可以减少primary节点负担,在primary节点跟secondary节点同步延迟较短、业务对数据不要求实时一致时可以利用副本集做读写分离和负载均衡。

副本集集群的读取有这几种使用方式:

primary: 默认参数,只从主节点读取;
primaryPreferred: 大部分从主节点上读取,主节点不可用时从Secondary节点读取;
secondary: 只从Secondary节点上进行读取操作;
secondaryPreferred: 优先从Secondary节点读取,Secondary节点不可用时从主节点读取;
nearest: 从网络延迟最低的节点上读取。

(1)测试1 优先从secondary读取数据:

复制代码

import pymongo client = pymongo.MongoReplicaSetClient('xxxhost: yyyport',  replicaSet='my_set', readPreference='secondaryPreferred') print client.read_preference  # 显示当前的读取设定 for i in xrange(1, 10000):  # 循环10000次,用mongostat观察查询负载     a = client['history']['20140409'].find_one({"ver_code": "128"})     print a

复制代码

(2)测试2 直接连接某Secondary节点读取数据:

import pymongo client = pymongo.MongoClient('xxxhost', yyyport, slaveOk=True) a = client['msgdc_ip']['query_ip'].find().count() print a

参考:

http://www.lanceyan.com/category/tech/mongodb
http://emptysqua.re/blog/reading-from-mongodb-replica-sets-with-pymongo/

http://api.mongodb.org/python/current/api/pymongo/read_preferences.html#module-pymongo.read_preferences

http://api.mongodb.org/python/current/api/pymongo/mongo_client.html#pymongo.mongo_client.MongoClient

注意:3.0之后MongoReplicaSetClient函数是要被放弃的。

但是测试时发现:在较低版本中,需要使用MongoReplicaSetClient,MongoClient无法实现 pymongo.ReadPreference.SECONDARY_PREFERRED功能。

 

 

本文所在:http://www.cnblogs.com/cswuyg/p/4595799.html 

 

 

转载于:https://www.cnblogs.com/qmfsun/p/4597607.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258698.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【论文阅读】Illuminating Pedestrians via Simultaneous Detection Segmentation

论文来源 ICCV2017arXiv reportgithub代码(caffe-matlab) 本文的主要问题是行人检测。作者探讨了如何将语义分割应用在行人检测上,提高检测率,同时也不损坏检测效率。作者提出了一种语义融合网络(segmentation infusion networks&#xff0…

Python ORM框架之 Peewee入门

之前在学Django时,发现它的模型层非常好用,把对数据库的操作映射成对类、对象的操作,避免了我们直接写在Web项目中SQL语句,当时想,如果这个模型层可以独立出来使用就好了,那我们平台操作数据库也可以这么玩…

天联高级版客户端_金万维天联高级版服务器安装配置全流程以及客户端登录流程...

今天下午,有一个使用千江软件的用户,他想实现千江软件的异地访问,经过他朋友也是金万维天联高级版的客户的介绍,推荐我们帮他安装天联高级版,从而实现千江软件的异地访问,千江软件本地访问界面如下&#xf…

[C#]async和await刨根问底

上一篇随笔留下了几个问题没能解决: 调用IAsyncStateMachine.MoveNext方法的线程何时发起的? lambda的执行为何先于MoveNext方法? 后执行的MoveNext方法做了些什么事情? 那么今天就来尝试解决它们吧~PS: 本文中部分代码来自上一篇…

Spring中Bean的定义继承

以下内容引用自http://wiki.jikexueyuan.com/project/spring/bean-definition-inheritance.html: Bean定义继承 bean定义可以包含很多的配置信息,包括构造函数的参数,属性值,容器的具体信息例如初始化方法,静态工厂方法…

由Google Protocol Buffer的小例子引起的g++编译问题

问题 学习 Google Protocol Buffer 的使用和原理时&#xff0c;提供了一个小例子&#xff0c;讲述了protobuf的使用方法。 假如已经有了如下文件&#xff1a; 其中writer.cpp如下&#xff1a;#include "lm.helloworld.pb.h" #include<iostream> #include<…

UVALive 5903 Piece it together(二分图匹配)

给你一个n*m的矩阵&#xff0c;每个点为B或W或.。然后你有一种碎片。碎片可以旋转&#xff0c;问可否用这种碎片精确覆盖矩阵。N,M<500 WB 《碎片 W 题目一看&#xff0c;感觉是精确覆盖&#xff08;最近被覆盖洗脑了&#xff09;&#xff0c;但是仔细分析可以知道&#xf…

springcloud(五):熔断监控Hystrix Dashboard和Turbine

Hystrix-dashboard是一款针对Hystrix进行实时监控的工具&#xff0c;通过Hystrix Dashboard我们可以在直观地看到各Hystrix Command的请求响应时间, 请求成功率等数据。但是只使用Hystrix Dashboard的话, 你只能看到单个应用内的服务信息, 这明显不够. 我们需要一个工具能让我们…

位运算问题

位运算 位运算是把数字用二进制表示之后&#xff0c;对每一位上0或者1的运算。 理解位运算的第一步是理解二进制。二进制是指数字的每一位都是0或者1.比如十进制的2转化为二进制之后就是10。在程序员的圈子里有一个流传了很久的笑话&#xff0c;说世界上有10种人&#xff0c;一…

conda环境管理介绍

我们可以使用conda 来切换不同的环境&#xff0c;主要的用法如下&#xff1a; 1. 创建环境 # 指定python版本为2.7&#xff0c;注意至少需要指定python版本或者要安装的包 # 后一种情况下&#xff0c;自动安装最新python版本conda create -n env_name python2.7# 同时安装必…

unable to execute dex: multiple dex files Cocos2dxAccelerometer

原文转载&#xff1a;http://discuss.cocos2d-x.org/t/conversion-to-dalvik-format-failed-unable-to-execute-dex-multiple-dex-files-define-lorg-cocos2dx-lib-cocos2dxaccelerometer/6652/4 用cocos2dx2.2.3没问题&#xff0c;用了3.1.1出现这个问题。确实够蛋疼。还要有这…

mysql自增_面试官:为什么 MySQL 的自增主键不单调也不连续?

为什么这么设计(Why’s THE Design)是一系列关于计算机领域中程序设计决策的文章&#xff0c;我们在这个系列的每一篇文章中都会提出一个具体的问题并从不同的角度讨论这种设计的优缺点、对具体实现造成的影响。如果你有想要了解的问题&#xff0c;可以在文章下面留言。当我们在…

使用过滤统计信息解决基数预估错误

基数预估是SQL Server里一颗隐藏的宝石。一般而言&#xff0c;基数预估指的是&#xff0c;在查询编译期间&#xff0c;查询优化器尝试找出在执行计划里从各个运算符平均返回的行数。这个估计用来驱动计划本身生成并选择正确的计划运算符——例如像Nested Loop, Merge Join,还是…

C# 委托链、多路广播委托

委托链、多路广播委托&#xff1a;也就是把多个委托链接在一起,我们把链接了多个方法的委托称为委托链或多路广播委托 例&#xff1a; 1 class HelloWorld2 {3 //定义委托类型4 delegate void DelegationChain();5 static void Main(string[] args)6 …

openssl 生成证书_使用证书和私钥导出P12格式个人证书!

【OpenSSL】使用证书和私钥导出P12格式个人证书1, 产生CA证书1.1, 生成ca的私钥openssl genrsa -out cakey.pem 20481.2, 生成ca的自签名证书请求openssl req -new -key cakey.pem -subj "/CNExample Root CA" -out cacsr.pem1.3, 自签名ca的证书openssl x509 -req -…

Faster RCNN minibatch.py解读

minibatch.py 的功能是&#xff1a; Compute minibatch blobs for training a Fast R-CNN network. 与roidb不同的是&#xff0c; minibatch中存储的并不是完整的整张图像图像&#xff0c;而是从图像经过转换后得到的四维blob以及从图像中截取的proposals&#xff0c;以及与之对…

oracle精简版_使用Entity Framework Core访问数据库(Oracle篇)

前言哇。。看看时间 真的很久很久没写博客了 将近一年了。最近一直在忙各种家中事务和公司的新框架 终于抽出时间来更新一波了。本篇主要讲一下关于Entity Framework Core访问oracle数据库的采坑。。强调一下&#xff0c;本篇文章发布之前 关于Entity Framework Core访问oracl…

java String部分源码解析

String类型的成员变量 /** String的属性值 */ private final char value[];/** The offset is the first index of the storage that is used. *//**数组被使用的开始位置**/private final int offset;/** The count is the number of characters in the String. *//**String中…

javascript之闭包理解以及应用场景

1 function fn(){2 var a 0;3 return function (){4 return a;5 } 6 }如上所示&#xff0c;上面第一个return返回的就是一个闭包&#xff0c;那么本质上说闭包就是一个函数。那么返回这个函数有什么用呢&#xff1f;那是因为这个函数可以调用到它外部的a…

faster rcnn学习之rpn、fast rcnn数据准备说明

在上文《 faster-rcnn系列学习之准备数据》,我们已经介绍了imdb与roidb的一些情况&#xff0c;下面我们准备再继续说一下rpn阶段和fast rcnn阶段的数据准备整个处理流程。 由于这两个阶段的数据准备有些重合&#xff0c;所以放在一起说明。 我们并行地从train_rpn与train_fas…