mongodb安装以及简单使用

Posted by MotorAo's Homepage on October 31, 2013

##下载

MongoDB的官网是http://www.mongodb.org/

生产环境中当然要使用stable,在这里下载stable版本即可。

本次安装操作系统为rhel6.4,32位。

##开始安装 下载安装包

1
2
3
4
cd /usr/local/src  
wget http://fastdl.mongodb.org/linux/mongodb-linux-i686-2.2.6.tgz  
tar zxvf mongodb-linux-i686-2.2.6.tgz  
mv mongodb-linux-i686-2.2.6 /usr/local/mongodb  

##运行

首先创建数据目录和日志目录,实验环境为了方便,我们就安装在本地mongodb目录下。

1
2
3
4
5
6
7
[root@localhost src]# cd /usr/local/mongodb/
[root@localhost mongodb]# ls
bin  GNU-AGPL-3.0  README  THIRD-PARTY-NOTICES
[root@localhost mongodb]# mkdir -p data/mongodb_data
[root@localhost mongodb]# mkdir -p data/mongodb_log
[root@localhost mongodb]# ls data/
mongodb_data  mongodb_log

运行

1
/usr/local/mongodb/bin/mongod --dbpath=data/mongodb_data/ --logpath=data/mongodb_log/mongodb.log &

这时我们发现日志里面有这一行报警:

Thu Oct 31 02:45:36 warning: 32-bit servers don’t have journaling enabled by default. Please use –journal if you want durability. 大意是,32位的mongo服务器默认未开启日志,如果想要开启日志,请加上–journal选项。

所以我们加上–journal选项,命令如下:

1
/usr/local/mongodb/bin/mongod --dbpath=data/mongodb_data/ --logpath=data/mongodb_log/mongodb.log --journal &

这时还有一个警告:

Thu Oct 31 02:47:22 [initandlisten] ** NOTE: when using MongoDB 32 bit, you are limited to about 2 gigabytes of data
Thu Oct 31 02:47:22 [initandlisten] ** see http://blog.mongodb.org/post/137788967/32-bit-limitations
Thu Oct 31 02:47:22 [initandlisten] ** with –journal, the limit is lower

大致意思是:32位系统的MongoDB服务器每一个Mongod实例只能使用2G的数据文件。这是由于地址指针只能支持32位。 所以在生产环境中,尽量使用64位的系统。

在这里检测mongodb是否已经正常运行:

1
2
3
[root@localhost mongodb]# netstat -nuptl|grep mongo
tcp        0      0 0.0.0.0:27017               0.0.0.0:*                   LISTEN      1455/mongod         
tcp        0      0 0.0.0.0:28017               0.0.0.0:*                   LISTEN      1455/mongod

IPTABLES

开启mongodb的27017和28017访问:

1
2
3
iptables -A INPUT -p tcp --dport 27017 -j ACCEPT
iptables -A INPUT -p tcp --dport 28017 -j ACCEPT
service iptables save

##简单使用examples:

到这里我们的mongodb已经安装完成了,装完了不使用当然没有任何意义,简单的使用范例如下:

系统操作命令

切换/创建数据库

1
use testDB;  当创建一个集合(table)的时候会自动创建当前数据库

查询所有数据库

1
show dbs;

删除当前使用数据库

1
db.dropDatabase();

从指定主机上克隆数据库

1
db.cloneDatabase(“127.0.0.1”); 将指定机器上的数据库的数据克隆到当前数据库

从指定的机器上复制指定数据库数据到某个数据库

1
db.copyDatabase("mydb", "temp", "127.0.0.1");将本机的mydb的数据复制到temp数据库中

查看当前使用的数据库

1
db.getName();

显示当前db状态

1
db.stats();

当前db版本

1
db.version();

查看当前db的链接机器地址

1
db.getMongo();

Collection聚集集合

创建一个聚集集合(table)

1
db.createCollection(“collName”, {size: 20, capped: 5, max: 100});

得到指定名称的聚集集合(table)

1
db.getCollection("account");

得到当前db的所有聚集集合

1
db.getCollectionNames();

显示当前db所有聚集索引的状态

1
db.printCollectionStats();

用户相关

添加一个用户

1
2
db.addUser("name");
db.addUser("userName", "pwd123", true); 添加设置是否只读

数据库安全模式

1
db.auth("userName", "123123");

显示当前所有用户

1
show users;

删除用户

1
db.removeUser("userName");

记录操作

查询所有记录

1
db.userInfo.find();

查询age = 22的记录

1
2
db.userInfo.find({"age": 22});
相当于: select * from userInfo where age = 22;

查询age > 22的记录

1
2
db.userInfo.find({age: {$gt: 22}});
相当于:select * from userInfo where age >22;

查询age < 22的记录

1
2
db.userInfo.find({age: {$lt: 22}});
相当于:select * from userInfo where age <22;

查询age >= 25的记录

1
2
db.userInfo.find({age: {$gte: 25}});
相当于:select * from userInfo where age >= 25;

查询age <= 25的记录

1
db.userInfo.find({age: {$lte: 25}});

查询age >= 23 并且 age <= 26

1
db.userInfo.find({age: {$gte: 23, $lte: 26}});

查询name中包含 mongo的数据

1
2
3
db.userInfo.find({name: /mongo/});
//相当于%%
select * from userInfo where name like ‘%mongo%’;

查询name中以mongo开头的

1
2
db.userInfo.find({name: /^mongo/});
select * from userInfo where name like ‘mongo%’;

查询指定列naage数据

1
2
3
db.userInfo.find({}, {name: 1, age: 1});
相当于:select name, age from userInfo;
当然name也可以用true或false,当用ture的情况下河name:1效果一样,如果用false就是排除name,显示name以外的列信息。

查询指定列naage数据, age > 25

1
2
db.userInfo.find({age: {$gt: 25}}, {name: 1, age: 1});
相当于:select name, age from userInfo where age >25;

按照年龄排序

1
2
升序:db.userInfo.find().sort({age: 1});
降序:db.userInfo.find().sort({age: -1});

查询在5-10之间的数据

1
2
db.userInfo.find().limit(10).skip(5);
可用于分页,limit是pageSize,skip是第几页pageSize

集合数据

添加

1
2
db.users.save({name: ‘zhangsan’, age: 25, sex: true});
添加的数据的数据列,没有固定,根据添加的数据为准

修改

1
2
3
4
5
6
7
8
db.users.update({age: 25}, {$set: {name: 'changeName'}}, false, true);
相当于:update users set name = ‘changeName’ where age = 25;

db.users.update({name: 'Lisi'}, {$inc: {age: 50}}, false, true);
相当于:update users set age = age + 50 where name = ‘Lisi’;

db.users.update({name: 'Lisi'}, {$inc: {age: 50}, $set: {name: 'hoho'}}, false, true);
相当于:update users set age = age + 50, name = ‘hoho’ where name = ‘Lisi’;

删除

1
db.users.remove({age: 132});

索引

创建索引

1
2
db.userInfo.ensureIndex({name: 1});
db.userInfo.ensureIndex({name: 1, ts: -1});

查询当前聚集集合所有索引

1
db.userInfo.getIndexes();

查看总索引记录大小

1
db.userInfo.totalIndexSize();

读取当前集合的所有index信息

1
db.users.reIndex();

删除指定索引

1
db.users.dropIndex("name_1");

删除所有索引索引

1
db.users.dropIndexes();