Chinaunix首页 | 论坛 | 博客
  • 博客访问: 189860
  • 博文数量: 29
  • 博客积分: 731
  • 博客等级: 上士
  • 技术积分: 435
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-06 16:18
文章分类

全部博文(29)

文章存档

2012年(29)

分类: LINUX

2012-04-12 17:06:49

 
 
1.下载安装包
wget
下载完成后解压缩压缩包
tar zxf mongodb-linux-i686-1.8.2.tgz

2. 安装准备
将mongodb移动到/usr/local/server/mongodb文件夹
mv mongodb-linux-i686-1.8.2 /usr/local/mongodb

创建数据库文件夹与日志文件
mkdir /usr/local/server/mongodb/data
touch /usr/local/server/mongodb/logs

3. 设置开机自启动
将mongodb启动项目追加入rc.local保证mongodb在服务器开机时启动
echo "/usr/local/server/mongodb/bin/mongod
--dbpath=/usr/local/server/mongodb/data
-logpath=/usr/local/server/mongodb/logs
-logappend --auth -port=27017" >> /etc/rc.local

4. 启动mongodb
cd到mongodb目录下的bin文件夹启动mongodb
//下面这个是需要权限的登录方式, 用户连接需要用户名和密码
/usr/local/server/mongodb/bin/mongod
--dbpath=/usr/local/server/mongodb/data
--logpath=/usr/local/server/mongodb/logs
--logappend --auth --port=27017 --fork
 
或者可以将启动参数写入config文件:
vi /etc/mongodb.conf

dbpath=/usr/local/server/mongodb/data
logpath=/usr/local/server/mongodb/logs
logappend=on
auth=on

bind_ip=192.168.1.222
port=27017
fork=on

rest=true             //开启web管理接口(如 命令访问)

 

/usr/local/server/mongodb/bin/mongod -f /etc/mongodb.conf     //启动mongo



//这个是不需要密码的
/usr/local/server/mongodb/bin/mongod --dbpath=/usr/local/server/mongodb/data --logpath=/usr/local/server/mongodb/logs

--logappend --port=27017 --fork


5. 参数解释: --dbpath 数据库路径(数据文件)
--logpath 日志文件路径
--master 指定为主机器
--slave 指定为从机器
--source 指定主机器的IP地址
--pologSize 指定日志文件大小不超过64M.因为resync是非常操作量大且耗时,最好通过设置一个足够大的oplogSize来避免resync(默认的 oplog大小是空闲磁盘大小的5%)。
--logappend 日志文件末尾添加
--port 启用端口号
--fork 在后台运行
--only 指定只复制哪一个数据库
--slavedelay 指从复制检测的时间间隔
--auth 是否需要验证权限登录(用户名和密码)


-h [ --help ] show this usage information
--version show version information
-f [ --config ] arg configuration file specifying additional options
--port arg specify port number
--bind_ip arg local ip address to bind listener - all local ips
bound by default
-v [ --verbose ] be more verbose (include multiple times for more
verbosity e.g. -vvvvv)
--dbpath arg (=/data/db/) directory for datafiles 指定数据存放目录
--quiet quieter output 静默模式
--logpath arg file to send all output to instead of stdout 指定日志存放目录
--logappend appnd to logpath instead of over-writing 指定日志是以追加还是以覆盖的方式写入日志文件
--fork fork server process 以创建子进程的方式运行
--cpu periodically show cpu and iowait utilization 周期性的显示cpu和io的使用情况
--noauth run without security 无认证模式运行
--auth run with security 认证模式运行
--objcheck inspect client data for validity on receipt 检查客户端输入数据的有效性检查
--quota enable db quota management 开始数据库配额的管理
--quotaFiles arg number of files allower per db, requires --quota 规定每个数据库允许的文件数
--appsrvpath arg root directory for the babble app server
--nocursors diagnostic/debugging option 调试诊断选项
--nohints ignore query hints 忽略查询命中率
--nohttpinterface disable http interface 关闭http接口,默认是28017
--noscripting disable scripting engine 关闭脚本引擎
--noprealloc disable data file preallocation 关闭数据库文件大小预分配
--smallfiles use a smaller default file size 使用较小的默认文件大小
--nssize arg (=16) .ns file size (in MB) for new databases 新数据库ns文件的默认大小
--diaglog arg 0=off 1=W 2=R 3=both 7=W+some reads 提供的方式,是只读,只写,还是读写都行,还是主要写+部分的读模式
--sysinfo print some diagnostic system information 打印系统诊断信息
--upgrade upgrade db if needed 如果需要就更新数据库
--repair run repair on all dbs 修复所有的数据库
--notablescan do not allow table scans 不运行表扫描
--syncdelay arg (=60) seconds between disk syncs (0 for never) 系统同步刷新磁盘的时间,默认是60s

Replication options:
--master master mode 主复制模式
--slave slave mode 从复制模式
--source arg when slave: specify master as 当为从时,指定主的地址和端口
--only arg when slave: specify a single database to replicate 当为从时,指定需要从主复制的单一库
--pairwith arg address of server to pair with
--arbiter arg address of arbiter server 仲裁服务器,在主主中和pair中用到
--autoresync automatically resync if slave data is stale 自动同步从的数据
--oplogSize arg size limit (in MB) for op log 指定操作日志的大小
--opIdMem arg size limit (in bytes) for in memory storage of op ids指定存储操作日志的内存大小

Sharding options:
--configsvr declare this is a config db of a cluster 指定shard中的配置服务器
--shardsvr declare this is a shard db of a cluster 指定shard服务器

6. 进入数据库的CLI管理界面
cd到mongodb目录下的bin文件夹,执行命令./mongo
运行如下:
[root@namenode mongodb]# ./bin/mongo
MongoDB shell version: 1.8.2
connecting to: test
> use test;
switched to db test

若数据库出现如不能连上,则是一个data目录下的mongod.lock文件的问题,可以用如下的修复的命令,
mongod --repair
 
Mongodb 与sql 语句对照

此处用mysql中的sql语句做例子,C# 驱动用的是samus,也就是上文中介绍的第一种.

引入项目MongoDB.dll

//创建Mongo连接

var mongo = new Mongo("mongodb://localhost");

 mongo.Connect(); //获取一个数据库,如果没有会自动创建一个

var db = mongo.GetDatabase("movieReviews"); //创建一个列表,并为这个列表创建文档

var movies = db.GetCollection("movies");

连接没问题之后,现在让我们用mysql 与mongodb的一些语句做下对比:

MongoDB Mysql
查询全部 movies.find(new Document()) SELECT * FROM movies
条件查询 movies.Find(new Document { { "title", "Hello Esr" } }); SELECT * FROM movies WHERE title= 'foobar'
查询数量 movies.Find(new Document { { "title", "测试2" } }).Documents.Count(); SELECT COUNT(*) FROM movies WHERE `title` = 'foobar'
数量范围查询 1, movies.Find(new Document().Add("$where", new Code("this.num > 50")));

2, movies.Find(new Document().Add("num", new Document().Add("$gt",50)));
($gt : > ; $gte : >= ; $lt : < ; $lte : <= ; $ne : !=)

3,movies.Find("this.num > 50");

4,movies.Find(new Document().Add("$where",new Code("function(x){ return this.num > 50};")));
select * from movies where num > 50
分页查询 movies.Find(new Document()).Skip(10).Limit(20); SELECT * FROM movies limit 10,20
查询排序语句 movies.Find(new Document()).Sort(new Document() { { "num", -1 } }); SELECT * FROM movies ORDER BY num DESC
查询指定字段 movies.Find(new Document().Add("num", new Document().Add("$gt", 50)), 10, 0, new Document() { { "title", 1 } }); select title from movies where num > 50
插入语句 movies.Insert(new Document() { { "title", "测试" }, { "resuleData", DateTime.Now } }); INSERT INOT movies (`title`, `reauleDate`) values ('foobar',25)
删除语句 movies.Remove(new Document() { { "title", "Hello Esr" } }); DELETE * FROM movies
更新语句

movies.Update(new Document() { { "title", "测试2" } }
, new Document() { { "title", "测试11111" } });

UPDATE movies SET `title` = ‘测试1111’ WHERE `title` = '测试1111'
Linq查询

(from item in db.GetCollection("movies").Linq()
where ((string)item["title"]).StartsWith("Esr")
select item);

select * from movies where title like ‘%Esr’

这里只举出了几个比较典型的例子,可以这么说,只要mysql可以完成的sql语句,在mongodb里面都可以实现.

 

 

Mongodb 命令行操作:



1. 超级用户相关:

1. #进入数据库admin

use admin         

2. #增加或修改用户密码

db.addUser('name','pwd')        //use进某个数据库addUser就是添加那个库的权限

db.addUser("readonly", "123456", true)     //第三个参数为true代表账户只读,默认是false

3. #查看用户列表

db.system.users.find()

4. #用户认证

db.auth('name','pwd')

5. #删除用户

db.removeUser('name')

6. #查看所有用户

show users

7. #查看所有数据库

show dbs

8. #查看所有的collection

show collections

9. #查看各collection的状态

db.printCollectionStats()

10. #查看主从复制状态

db.printReplicationInfo()

11. #修复数据库

db.repairDatabase()

12. #设置记录profiling,0=off 1=slow 2=all

db.setProfilingLevel(1)

13. #查看profiling

show profile

14. #拷贝数据库

db.copyDatabase('mail_addr','mail_addr_tmp')

15. #删除collection

db.mail_addr.drop()

16. #删除当前的数据库

db.dropDatabase()

17. #备份数据库

/usr/local/server/mongodb/bin/mongodump -d 数据库名 -o 备份输出目录名

18. #恢复数据库

mongodb/bin/mongorestore -d 数据库名 --drop backup/test   //--drop代表恢复前删除集合(若存在)

19. #修复数据库

use test

db.repairDatabase()



2. 增删改

1. #存储嵌套的对象

db.foo.save({'name':'ysz','address':{'city':'beijing','post':100096},'phone':[138,139]})



2. #存储数组对象

db.user_addr.save({'Uid':'yushunzhi@sohu.com','Al':['test-1@sohu.com','test-2@sohu.com']})



3. #根据query条件修改,如果不存在则插入,允许修改多条记录

db.foo.update({'yy':5},{'$set':{'xx':2}},upsert=true,multi=true)

4. #删除yy=5的记录

db.foo.remove({'yy':5})

5. #删除所有的记录

db.foo.remove()



3. 索引

1. #增加索引:1(ascending),-1(descending)

2. db.foo.ensureIndex({firstname: 1, lastname: 1}, {unique: true});

3. #索引子对象

4. db.user_addr.ensureIndex({'Al.Em': 1})

5. #查看索引信息

6. db.foo.getIndexes()

7. db.foo.getIndexKeys()

8. #根据索引名删除索引

9. db.user_addr.dropIndex('Al.Em_1')



4. 查询

1. #查找所有

2. db.foo.find()

3. #查找一条记录

4. db.foo.findOne()

5. #根据条件检索10条记录

6. db.foo.find({'msg':'Hello 1'}).limit(10)

7. #sort排序

8. db.deliver_status.find({'From':'ixigua@sina.com'}).sort({'Dt',-1})

9. db.deliver_status.find().sort({'Ct':-1}).limit(1)

10. #count操作

11. db.user_addr.count()

12. #distinct操作,查询指定列,去重复

13. db.foo.distinct('msg')

14. #”>=”操作

15. db.foo.find({"timestamp": {"$gte" : 2}})

16. #子对象的查找

17. db.foo.find({'address.city':'beijing'})

5. 管理

1. #查看collection数据的大小

2. db.deliver_status.dataSize()

3. #查看colleciont状态

4. db.deliver_status.stats()

5. #查询所有索引的大小

6. db.deliver_status.totalIndexSize()



5. advanced queries:高级查询


条件操作符
$gt : >
$lt : <
$gte: >=
$lte: <=
$ne : !=、<>
$in : in
$nin: not in
$all: all
$not: 反匹配(1.3.3及以上版本)

查询 name <> "bruce" and age >= 18 的数据
db.users.find({name: {$ne: "bruce"}, age: {$gte: 18}});

查询 creation_date > '2010-01-01' and creation_date <= '2010-12-31' 的数据
db.users.find({creation_date:{$gt:new Date(2010,0,1), $lte:new Date(2010,11,31)});

查询 age in (20,22,24,26) 的数据
db.users.find({age: {$in: [20,22,24,26]}});

查询 age取模10等于0 的数据
db.users.find('this.age % 10 == 0');
或者
db.users.find({age : {$mod : [10, 0]}});

匹配所有
db.users.find({favorite_number : {$all : [6, 8]}});
可以查询出{name: 'David', age: 26, favorite_number: [ 6, 8, 9 ] }
可以不查询出{name: 'David', age: 26, favorite_number: [ 6, 7, 9 ] }

查询不匹配name=B*带头的记录
db.users.find({name: {$not: /^B.*/}});
查询 age取模10不等于0 的数据
db.users.find({age : {$not: {$mod : [10, 0]}}});

#返回部分字段
选择返回age和_id字段(_id字段总是会被返回)
db.users.find({}, {age:1});
db.users.find({}, {age:3});
db.users.find({}, {age:true});
db.users.find({ name : "bruce" }, {age:1});
0为false, 非0为true

选择返回age、address和_id字段
db.users.find({ name : "bruce" }, {age:1, address:1});

排除返回age、address和_id字段
db.users.find({}, {age:0, address:false});
db.users.find({ name : "bruce" }, {age:0, address:false});

数组元素个数判断
对于{name: 'David', age: 26, favorite_number: [ 6, 7, 9 ] }记录
匹配db.users.find({favorite_number: {$size: 3}});
不匹配db.users.find({favorite_number: {$size: 2}});

$exists判断字段是否存在
查询所有存在name字段的记录
db.users.find({name: {$exists: true}});
查询所有不存在phone字段的记录
db.users.find({phone: {$exists: false}});

$type判断字段类型
查询所有name字段是字符类型的
db.users.find({name: {$type: 2}});
查询所有age字段是整型的
db.users.find({age: {$type: 16}});

对于字符字段,可以使用正则表达式
查询以字母b或者B带头的所有记录
db.users.find({name: /^b.*/i});

$elemMatch(1.3.1及以上版本)
为数组的字段中匹配其中某个元素

Javascript查询和$where查询
查询 age > 18 的记录,以下查询都一样
db.users.find({age: {$gt: 18}});
db.users.find({$where: "this.age > 18"});
db.users.find("this.age > 18");
f = function() {return this.age > 18} db.users.find(f);

排序sort()
以年龄升序asc
db.users.find().sort({age: 1});
以年龄降序desc
db.users.find().sort({age: -1});

限制返回记录数量limit()
返回5条记录
db.users.find().limit(5);
返回3条记录并打印信息
db.users.find().limit(3).forEach(function(user) {print('my age is ' + user.age)});
结果
my age is 18
my age is 19
my age is 20

限制返回记录的开始点skip()
从第3条记录开始,返回5条记录(limit 3, 5)
db.users.find().skip(3).limit(5);

查询记录条数count()
db.users.find().count();
db.users.find({age:18}).count();
以下返回的不是5,而是user表中所有的记录数量
db.users.find().skip(10).limit(5).count();
如果要返回限制之后的记录数量,要使用count(true)或者count(非0)
db.users.find().skip(10).limit(5).count(true);

分组group()
假设test表只有以下一条数据
{ domain: ""
, invoked_at: {d:"2009-11-03", t:"17:14:05"}
, response_time: 0.05
, http_action: "GET /display/DOCS/Aggregation"
}
使用group统计test表11月份的数据count:count(*)、total_time:sum(response_time)、avg_time:total_time/count;
db.test.group(
{ cond: {"invoked_at.d": {$gt: "2009-11", $lt: "2009-12"}}
, key: {http_action: true}
, initial: {count: 0, total_time:0}
, reduce: function(doc, out){ out.count++; out.total_time+=doc.response_time }
, finalize: function(out){ out.avg_time = out.total_time / out.count }
} );

[
{
"http_action" : "GET /display/DOCS/Aggregation",
"count" : 1,
"total_time" : 0.05,
"avg_time" : 0.05
}
]


 

阅读(6251) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~

我是月老2012-04-15 20:50:10

恩恩,楼主貌似比较专业啊~是干什么的啊

sai99242012-04-13 13:20:29

效率要看多个方面
mongo 一般用来处理大数据量的处理,比如每小时要处理几十G的日志文件数据,这样的大数据量只能用mongo集群来处理了,还有在使用它时,不用先设计数据库结构。

桔子T恤2012-04-13 13:06:43

请问mongodb和mysql效率哪个高???网上说是mongodb,有没有具体理由啊?