安装
创建mongodb用户
[root@dg_135 ~]# groupadd -g 1005 mongodb
安装mongodb
[root@dg_135 ~]# cd /home/mongodb/
[root@dg_135 mongodb]# tar zxfv mongodb-linux-x86_64-2.4.4.tgz
[root@dg_135 mongodb]# mv mongodb-linux-x86_64-2.4.4 mongodb
[root@dg_135 ~]# mkdir -p /tol/mongodb/data
[root@dg_135 ~]# mkdir -p /tol/mongodb/log
[root@dg_135 mongodb]# chown -R mongodb.mongodb mongodb
[root@dg_135 ~]# chown -R mongodb.mongodb /tol/mongodb/data
[root@dg_135 ~]# chown -R mongodb.mongodb /tol/mongodb/log
[root@dg_135 mongodb]# su - mongodb
[mongodb@dg_135 ~]$ vim .bash_profile
export MONGODB=/home/mongodb/mongodb
export MONGO_DATA=/tol/mongodb/data
PATH=$PATH:$HOME/bin:$MONGODB/bin
export PATH
[mongodb@dg_135 ~]$ . .bash_profile
启动
[mongodb@dg_135 ~]$ nohup mongod --dbpath=/tol/mongodb/data/
--logpath=/tol/mongodb/log/mongo.log --logappend --port=27017
> /tol/mongodb/log/start_mongodb.log 2>&1 &
or
nohup mongod --auth --dbpath=/tol/mongodb/data/
--logpath=/tol/mongodb/log/mongo.log --logappend --port=27017
> /tol/mongodb/log/start_mongodb.log 2>&1 &
查看进程:
[mongodb@dg_135 ~]$ ps aux | grep mongo
root 17491 0.0 0.0 101076 1356
pts/1 S 16:57 0:00 su -
mongodb
mongodb 17492 0.0 0.0 66076 1580
pts/1 S 16:57 0:00 -bash
mongodb 19112 16.3 0.0 154340 38000 pts/1
Dl 17:15 0:01 mongod
--dbpath=/tol/mongodb/data/ --logpath=/tol/mongodb/log/mongo.log
--logappend --port=27017
mongodb 19116 2.0 0.0 65604 988
pts/1 R+ 17:15 0:00 ps aux
mongodb 19117 0.0 0.0 61168 768
pts/1 S+ 17:15 0:00 grep mongo
第一次连接:
[mongodb@dg_135 ~]$ mongo
MongoDB shell version: 2.4.4
connecting to: test
Thu Jun 20 17:15:54.108 JavaScript execution failed: Error:
couldn't connect to server 127.0.0.1:27017 at
src/mongo/shell/mongo.js:L112
exception: connect failed
如果报错,指定dbpath连接一下
[mongodb@dg_135 ~]$ mongod --dbpath /tol/mongodb/data/
然后再重新连接
[mongodb@dg_135 ~]$ mongo
MongoDB shell version: 2.4.4
connecting to: test
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
http://docs.mongodb.org/
Questions? Try the support group
http://groups.google.com/group/mongodb-user
> show dbs;
local 0.078125GB
>
设置密码
Mongodb默认是以无用户和密码的方式启动的,在生产环境中需要为生产数据库创建用户名和密码,mongodb的用户名和密码是针对具体的数据库设置的
登陆到数据库,切换到要使用的数据库
添加用户(注意命令大小写)
> db.addUser ("koostorage","XXXXXX");
{
"user" : "db2",
"readOnly" : false,
"pwd" :
"d7d06027ffb73b651acf1574cfc98e42",
"_id" :
ObjectId("51c3e35ae533478e93191ef2")
}
验证用户
> db.auth("koostorage","XXXXXX");
1
查看系统已经存在的用户
db.system.users.find();
为数据库设置密码以后,如果想让客户端连接db时需要输入用户名和密码,那么数据在启动时需要以auth的方式启动
客户端在连接时如果没有提供用户名和密码参数,可以连接上数据库,但是不能做任何操作
删除用户
> db.system.users.remove({user:"goolen"});
常用操作
使用mongo命令连接,如果数据库设置了密码需要提供用户名和密码
Mongo 直接连接test数据库
mongo 的格式
mongo [options] [db address] [file names (ending in .js)]
例如:
mongo 192.168.100.15:xxxx/admin -u admin -p admin
mongo --port 27017 -host 192.168.100.25 admin -u -p admin
如果不提供端口默认连接到27017端口
db address 不提供将会连接到test数据库
查看帮助
> help
查看所有数据库
> show dbs;
local 0.078125GB
查看当前正在使用的数据库
> db
test
切换数据库 use dbname
> db
test
> use goolen;
switched to db goolen
> db
goolen
查看当前数据库里有多少个collection
> show collections;
goolen
mongodb
system.indexes
看collection中的内容 db.collectionsname.find()
> db.goolen.find();
{ "_id" : ObjectId("51c552658ccac58145eeed44"), "id" : 1, "name" :
"scott", "email" : "234@qq.com" }
{ "_id" : ObjectId("51c5527f8ccac58145eeed45"), "id" : 2, "name" :
"lily", "email" : "678@qq.com" }
插入数据 db.collectionsname.save();
> db.goolen.save({1:"goolen"});
> db.goolen.save({2:"scott"});
更新数据 db.collectionsname.update();
> db.goolen.update({'id':2},{$set:{'name':'lilei'}});
删除数据 db.collectionsname.remove();
> db.goolen.remove({'id':2});
删除collections db.collectionsname.drop()
> show collections;
system.indexes
t1
> db.t1.drop();
true
> show collections;
system.indexes
创建数据库及collection
不需要显式创建,不需要显式创建是什么意思?就是没有专门创建用的命令,而一旦你使用了save()保存了一个数据,相对应的database及collection会自动建好。
> show dbs
local 0.078125GB
test 0.203125GB
> use db2
switched to db db2
> db.t1.save({1:"name"});
> use admin
> show dbs
db2 0.203125GB
local 0.078125GB
test 0.203125GB
从目标服务器克隆一个数据库
db.cloneDataBase(fromhost)
复制数据库
fromdb---源数据库名称,todb---目标数据库名称,fromhost---源数据库服务器地址
db.copyDatabase(fromdb,todb,fromhost)
创建一个数据集,相当于一个表
db.createCollection(name,{size:3333,capped:333,max:88888})
db.currentOp() 取消当前库的当前操作
db.dropDataBase() 删除当前数据库
db.eval(func,args) run code server-side
db.getCollection(cname) 取得一个数据集合,同用法:db['cname']
or
db.getCollenctionNames() 取得所有数据集合的名称列表
db.getLastError() 返回最后一个错误的提示消息
db.getLastErrorObj() 返回最后一个错误的对象
db.getPrevError() 返回上一个错误对象
db.getProfilingLevel()
db.getName() 返回当操作数据库的名称
db.getReplicationInfo() 获得重复的数据
db.getSisterDB(name) get the db at the same server as this
onew
db.killOp() 停止(杀死)在当前库的当前操作
db.printCollectionStats() 返回当前库的数据集状态
db.printReplicationInfo()
db.printSlaveReplicationInfo()
db.printShardingStatus() 返回当前数据库是否为共享数据库
db.removeUser(username) 删除用户
db.repairDatabase() 修复当前数据库
db.resetError()
db.runCommand(cmdObj) run a database command. if cmdObj is a
string, turns it into {cmdObj:1}
db.setProfilingLevel(level) 0=off,1=slow,2=all
db.shutdownServer() 关闭当前服务程序
db.version() 返回当前程序的版本信息
db.test.find({id:10}) 返回test数据集ID=10的数据集
db.test.find({id:10}).count() 返回test数据集ID=10的数据总数
db.test.find({id:10}).limit(2) 返回test数据集ID=10的数据集从第二条开始的数据集
db.test.find({id:10}).skip(8) 返回test数据集ID=10的数据集从0到第八条的数据集
db.test.find({id:10}).limit(2).skip(8) 返回test数据集ID=1=的数据集从第二条到第八条的数据
db.test.find({id:10}).sort() 返回test数据集ID=10的排序数据集
db.test.findOne([query]) 返回符合条件的一条数据
db.test.getDB() 返回此数据集所属的数据库名称
db.test.getIndexes() 返回些数据集的索引信息
db.test.group({key:...,initial:...,reduce:...[,cond:...]})
db.test.mapReduce(mayFunction,reduceFunction,
db.test.remove(query) 在数据集中删除一条数据
db.test.renameCollection(newName) 重命名数据集名称
db.test.save(obj) 往数据集中插入一条数据
db.test.stats() 返回此数据集的状态
db.test.storageSize() 返回此数据集的存储大小
db.test.totalIndexSize() 返回此数据集的索引文件大小
db.test.totalSize() 返回数据集的总大小
db.test.update(query,object[,upsert_bool]) 在此数据集中更新一条数据
db.test.validate() 验证此数据集
db.test.getShardVersion() 返回数据集共享版本号
db.link.find().size();
117440
复制远程库的collection
db.runCommand({cloneCollection:"koolearn.link",from:"172.18.32.138:27017"})
复制本地库collection
db.src_collection.find().forEach(function(x){db.target_collection.insert(x)})
mongod --fork --port 27017 --dbpath /home/mongodb--single--data --logpath /home/mongodb--single--data/mongodb.log --logappend
需要client提供用户名和密码连接nohup启动:
[mongodb@dg_135 ~]$ nohup mongod --dbpath=/tol/mongodb/data/ --logpath=/tol/mongodb/log/mongo.log --logappend --port=27017 > /tol/mongodb/log/start_mongodb.log 2>&1 &
关闭:
登陆mongodb
User admin
db.shutdownServer()
注意不要强行杀进程,强行杀进程有可能导致mongodb.lock文件锁不释放,在此启动时会无法启动
MongoDB语法 MySql语法
db.test.find({'name':'foobar'}) <==> select * from test where
name='foobar'
db.test.find() <==> select * from test
db.test.find({'ID':10}).count() <==> select count(*) from
test where ID=10
db.test.find().skip(10).limit(20) <==> select * from test
limit 10,20
db.test.find({'ID':{$in:[25,35,45]}}) <==> select * from test
where ID in (25,35,45)
db.test.find().sort({'ID':-1}) <==> select * from test order
by ID desc
db.test.distinct('name',{'ID':{$lt:20}}) <==> select
distinct(name) from test where ID<20
db.test.group({key:{'name':true},cond:{'name':'foo'},reduce:function(obj,prev){prev.msum+=obj.marks;},initial:{msum:0}})
<==> select name,sum(marks) from test group by name
db.test.find('this.ID<20',{name:1}) <==> select name from
test where ID<20
db.test.insert({'name':'foobar','age':25})<==>insert into
test ('name','age') values('foobar',25)
db.test.remove({}) <==> delete * from test
db.test.remove({'age':20}) <==> delete test where
age=20
db.test.remove({'age':{$lt:20}}) <==> delete test where
age<20
db.test.remove({'age':{$lte:20}}) <==> delete test where
age<=20
db.test.remove({'age':{$gt:20}}) <==> delete test where
age>20
db.test.remove({'age':{$gte:20}}) <==> delete test where
age>=20
db.test.remove({'age':{$ne:20}}) <==> delete test where
age!=20
db.test.update({'name':'foobar'},{$set:{'age':36}}) <==>
update test set age=36 where name='foobar'
db.test.update({'name':'foobar'},{$inc:{'age':3}}) <==>
update test set age=age+3 where
name='foobar'
备份恢复:
mongodump/mongorestore
>mongodump -h dbhost -d dbname -o dbdirectory
-h:MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
-d:需要备份的数据库实例,例如:test
-o:备份的数据存放位置,例如:c:\data\dump,当然该目录需要提前建立,在备份完成后,系统自动在dump目录下建立一个test目录,这个目录里面存放该数据库实例的备份数据。
>mongorestore -h dbhost -d dbname --directoryperdb
dbdirectory
-h:MongoDB所在服务器地址
-d:需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2
--directoryperdb:备份数据所在位置,例如:c:\data\dump\test,这里为什么要多加一个test,而不是备份时候的dump,读者自己查看提示吧!
--drop:恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用哦!
其他:
mongoimport / mongoexport
mongoexport -d koolearn -c link -o link.dat
参数说明:
-d:指明使用的库
-c:指明要导出的集合
-o:指明要导出的文件名
从上面的结果可以看出,我们在导出数据时没有显示指定导出样式
,默认导出了JSON格式的数据。如果我们需要导出CSV格式的数据,则需要使用--csv参数,具体如下所示:
mongoexport -d koolearn -c link --csv -f classid,name,age -o
link_csv.dat
参数说明:
-csv:指明要导出为csv格式
-f:指明需要导出classid、name、age这3列的数据
mongoimport -d koostorage -c link link.dat
参数说明:
-h:指明数据库宿主机的IP
-u:指明数据库的用户名
-p:指明数据库的密码
-d:指明数据库的名字
-c:指明collection的名字
-f:指明要导入那些列
-type:指明要导入的文件格式
-headerline:指明第一行是列名,不需要导入
-file:指明要导入的文件