mongo常用命令
索引
普通索引
1、唯一索引
db.posts.ensureIndex({slug:1})
查询:db.posts.find({slug:'state-of-mongodb-2010'})
索引:db.posts.ensureIndex({slug:1},{unique:true});
2、组合索引
查询:db.comments.find({tags:'mongodb'}).sort({created_at:-1});
索引:db.comments.ensureIndex({tags:1,created_at:-1});
查询数据用指定索引hint
db.person.find({tags:'tags',created_at:'created_at'}).hint({tags:1,created_at:1})
查询索引
db.posts.getIndexes()
查看索引大小
db.comments.totalIndexSize();
删除索引
db.comments.dropIndex("name_1")
通常需要索引的字段是:
1.唯一键_id是默认被设置为索引的
2.需要被查找的字段应该建立索引,比如在find()里面的字段
3.需要被排序的字段应该建立索引。比如在sort()里面的字段
<1>count
db.user.count()
db.user.count({'age':20})
<2>distinct
db.user.distinct('user')
<3>group
db.pal.group({'key':{'pal':true},'initial':{'pal':[]},'$reduce':function(cur,prev){prev.pal.push(cur.pal);}})
db.pal.group({'key':{'pal':true},'initial':{'pal':[]},'$reduce':function(cur,prev){prev.pal.push(cur.pal);},'finalize':function(out){out.count=out.person.length;},'condition':{'age':{$lt:25}}})
<4>mapReduce
导出数据
mongoexport-dqnmsg-cmsg-omsg.dat
-d指明使用的库,本例中为”my_mongodb”
-c指明要导出的表,本例中为”user”
-o指明要导出的文件名,本例中为”user.dat”
从上面可以看到导出的方式使用的是JSON的样式
mongoexport-dqnlbs-cuser--csv-fuserID,age-ouser_csv.dat
-csv指要要导出为csv格式
-f指明需要导出哪些例
数据导入mongoimport
mongoimport-dqnmsg-cmsgpal.msg
mongoimport-dqnlbs-cuser--typecsvuser.cvs
mongoimport-dqnmsg-cpal--typecsv--headerline--file/root/bak/test.csv--hostmd02:30000
主从复制
第一步:我们把mongodb文件夹放在D盘和E盘,模拟放在多服务器上。
第二步:启动D盘上的mongodb,把该数据库指定为主数据库,其实命令很简单:>mongodb--dbpath='XXX'--master,
端口还是默认的27017.
第三步:同样的方式启动E盘上的mongodb,指定该数据库为从属数据库,命令也很简单,当然我们要换一个端口,比如:8888。
source表示主数据库的地址。
>mongod--dbpath=xxxx--port=8888--slave--source=127.0.0.1:27017
副本集
第一步:既然我们要建立集群,就得取个集群名字,这里就取我们的公司名shopex,--replSet表示让服务器知道shopex下还有其他数据库,
这里就把D盘里面的mongodb程序打开,端口为2222。指定端口为3333是shopex集群下的另一个数据库服务器。
mongod--dbpath=D:\mongodb\db--port2222--replSetshopex/127.0.0.1:3333
第二步:既然上面说3333是另一个数据库服务器,不要急,现在就来开,这里把E盘的mongodb程序打开。
mongod--dbpath=D:\mongodb\db--port3333--replSetshopex/127.0.0.1:2222
第三步:ok,看看上面的日志红色区域,似乎我们还没有做完,是的,log信息告诉我们要初始化一下“副本集“,既然日志这么说,那我也就
这么做,随便连接一下哪个服务器都行,不过一定要进入admin集合。
mongo127.0.0.1:2222
useadmin
db.runCommand({'replSetinitiate':{'_id':'shopex','members':[
{'_id':1,'host':'127..0.0.1:2222'},
{'_id':2,'host':'127..0.0.1:3333'}
]}})
第四步:开启成功后,我们要看看谁才能成为主数据库服务器,可以看到端口为2222的已经成为主数据库服务器。
第五步:我们知道sqlserver里面有一个叫做仲裁服务器,那么mongodb中也是有的,跟sqlserver一样,仲裁只参与投票选举,这里我们
把F盘的mongodb作为仲裁服务器,然后指定shopex集群中的任一个服务器端口,这里就指定2222。
mongod--dbpath=F:\mongodb\db--port4444--replSetshopex/127.0.0.1:2222
然后我们在admin集合中使用rs.addArb()追加即可。
mongo127.0.0.1:2222/admin
rs.addArb('127.0.0.1:4444')
追加好了之后,我们使用rs.status()来查看下集群中的服务器状态,图中我们可以清楚的看到谁是主,还是从,还是仲裁。
mongoexport-dnew_q-copenapps_visitlog-q'{request_time:{$gte:newDate(1334592000000)}}'-o/home/oracle/openapps_visitlog.js
mongoexport-h"127.0.0.1"-dqnlbs-cuser-csv-otest1.csv-q'{"img":{"$ne":""}}'-fuserID,uname,email,sex,birthday,age,img,photo.mypto
mongoimport-dtest-cuser--typecsv--headerline--file/qn/test1.csv
db.power.distinct("userID").length
查看keyword表中keyword字段没有重复的记录总数
数据备份mongodump
./mongodump-dmy_mongodb
此时会在当前目录下创建一个dump目录,用于存放备份出来的文件
也可以指定备份存放的目录,
./mongodump-dmy_mongodb-omy_mongodb_dump
这个例子中将备份的文件存在了当前目录下的my_mongodb_dump目录下
数据恢复mongorestore
由于刚刚已经做了备份,所以我们先将库my_mongodb删除掉
usemy_mongodb
db.dropDatabase()
./mongorestore-dmy_mongodbmy_mongodb_dump/*
mongodump-dqnlbs
Profiler默认是关闭的,你可以选择全部开启,或者有慢查询的时候开启。
慢查询开启:
db.setProfilingLevel(2);
db.getProfilingLevel()
查看Profile日志
db.system.profile.find().sort({$natural:-1})
MongoDBMonitoringService(MMS)是Mongodb厂商提供的监控服务,可以在网页和Android客户端上监控你的MongoDB状况。
db.help();
DBmethods:
db.addUser(username,password)添加数据库授权用户
db.auth(username,password)访问认证
db.cloneDatabase(fromhost)克隆数据库
db.commandHelp(name)returnsthehelpforthecommand
db.copyDatabase(fromdb,todb,fromhost)复制数据库
db.createCollection(name,{size:...,capped:...,max:...})创建表
db.currentOp()displaysthecurrentoperationinthedb
db.dropDatabase()删除当前数据库
db.eval(func,args)runcodeserver-side
db.getCollection(cname)sameasdb['cname']ordb.cname
db.getCollectionNames()获取当前数据库的表名
db.getLastError()-justreturnstheerrmsgstring
db.getLastErrorObj()-returnfullstatusobject
db.getMongo()gettheserverconnectionobject
db.getMongo().setSlaveOk()allowthisconnectiontoreadfromthenonmastermemberofareplicapair
db.getName()
db.getPrevError()
db.getProfilingLevel()
db.getReplicationInfo()
db.getSisterDB(name)getthedbatthesameserverasthisonew
db.killOp()killsthecurrentoperationinthedb
db.printCollectionStats()打印各表的状态信息
db.printReplicationInfo()打印主数据库的复制状态信息
db.printSlaveReplicationInfo()打印从数据库的复制状态信息
db.printShardingStatus()打印分片状态信息
db.removeUser(username)删除数据库用户
db.repairDatabase()修复数据库
db.resetError()
db.runCommand(cmdObj)runadatabasecommand.ifcmdObjisastring,turnsitinto{cmdObj:1}
db.setProfilingLevel(level)0=off1=slow2=all
db.shutdownServer()
db.version()currentversionoftheserver
db.user.help();user为表名
DBCollectionhelp
db.foo.count()统计表的行数
db.foo.dataSize()统计表数据的大小
db.foo.distinct(key)-eg.db.foo.distinct('x')按照给定的条件除重
db.foo.drop()dropthecollection删除表
db.foo.dropIndex(name)删除指定索引
db.foo.dropIndexes()删除所有索引
db.foo.ensureIndex(keypattern,options)-optionsshouldbeanobjectwiththesepossiblefields:name,unique,dropDups增加索引
db.foo.find([query],[fields])-firstparameterisanoptionalqueryfilter.secondparameterisoptionalsetoffieldstoreturn.根据条件查找数据
e.g.db.foo.find({x:77},{name:1,x:1})
db.foo.find(...).count()
db.foo.find(...).limit(n)根据条件查找数据并返回指定记录数
db.foo.find(...).skip(n)
db.foo.find(...).sort(...)查找排序
db.foo.findOne([query])根据条件查询只查询一条数据
db.foo.getDB()getDBobjectassociatedwithcollection返回表所属的库
db.foo.getIndexes()显示表的所有索引
db.foo.group({key:...,initial:...,reduce:...[,cond:...]})根据条件分组
db.foo.mapReduce(mapFunction,reduceFunction,<optionalparams>)
db.foo.remove(query)根据条件删除数据
db.foo.renameCollection(newName)renamesthecollection重命名表
db.foo.save(obj)保存数据
db.foo.stats()查看表的状态
db.foo.storageSize()-includesfreespaceallocatedtothiscollection查询分配到表空间大小
db.foo.totalIndexSize()-sizeinbytesofalltheindexes查询所有索引的大小
db.foo.totalSize()-storageallocatedforalldataandindexes查询表的总大小
db.foo.update(query,object[,upsert_bool])根据条件更新数据
db.foo.validate()-SLOW验证表的详细信息
db.foo.getShardVersion()-onlyforusewithsharding