当前位置:  开发笔记 > 编程语言 > 正文

MongoDB数据库的安装与使用

安装创建mongodb用户[root@dg_135~]#groupadd-g1005mongodb[root@dg_135~]#useradd-gmongodb-s/bin/bash-d/home/mongodb-m-u1005mongodb[root@dg_135~]#chown-Rmongodb.mongodb/h

安装

创建mongodb用户

[root@dg_135 ~]# groupadd -g 1005 mongodb
[root@dg_135 ~]# useradd -g mongodb -s /bin/bash -d /home/mongodb -m -u 1005 mongodb
[root@dg_135 ~]# chown -R mongodb.mongodb  /home/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.getMongo() 取得当前服务器的连接对象get the server 
db.getMondo().setSlaveOk() allow this connection to read from then nonmaster membr of a replica pair 


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

单实例启动是mongodb最简单的启动方式,此中启动方式一般作为测试数据库时启动,mongodb有许多启动参数具体的可以通过命令
Mongod ?help查看
Su ? mongodb
以下启动不需要client提供用户名和密码连接

mongod --fork  --port 27017  --dbpath  /home/mongodb--single--data  --logpath /home/mongodb--single--data/mongodb.log   --logappend 

需要client提供用户名和密码连接
mongod --fork --auth --port 27017  --dbpath  /home/mongodb--single--data  --logpath /home/mongodb--single--data/mongodb.log  --logappend 
启动成功后会看到如下信息
forked process: 3461
all output going to: /home/mongodb--single--data/mongodb.log

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:指明要导入的文件

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有