/*
@author:luowen
@time:2013-08-01
[mongoDB]
1.mongoDB安装
下载mongodb-linux-i686-2.2.5.tgz
tar -zxvf mongodb-linux-i686-2.2.5.tgz
将其拷贝到/usr/local/mongodb
在mongodb目录下创建data log 目录
进入 bin ./mongod --dbpath=/usr/local/mongodb/data --logpath=/usr/local/mongodb/logs --fork 启动服务
//可以将这个语句添加到/etc/init/local文件中每次自动启动
./mongo 进入数据库使用
2.一些基本的操作
db.c1.find().sort({age:1}).skip(2).limit(3).count(1);
$all :查询包含的
{name:'luowen',post:[1,23,4,5]}
db.c1.find({post:{$all:[1,2]}}) --> true;
db.c1.find({post:{$all:[1,2,4]}}) --> false;
$exists 测试一个字段是否存在 xx.xx.find({$exists:[post]})
$mod 取余 xx.xx.find({id:{$mod:[1,2,]}})
$ne 不等于 xx.xx.find({id:{$ne:[1,2,3,2]}})
$in xx.xx.find({id:{$in:[12,12,2,2]}});
$nin xx.xx.find({id:{$nin:[1,2,3,4,5,5]}})
$or 名字是user1或者age是1的记过 xx.xx.find({$or:[{name:'user1',age:1}]})
$nor 名字不是user1 age不是1的 xx.xx.find({$nor:[{name:'user1',age:1}])
$size 去除post的值是3的数据 xx.xx.insert({post:[1,2,3]}) xx.xx.find({post:{$size:3}})
$skip $limit 实现分页
$elemMatch 元素匹配 匹配数组arr中id为3的值
xx.xx.find({arr:{$elemMathc:{id:3}}})
游标 x = xx.xx.find() x.hasNext() 判断 x.next() 取出内容
$slice xx.xx.find({name:'user'},{post:{$slice:3}}) 去出前三篇帖子
[update]
$set 保存原有的格式,然后在修改 xx.xx.update({name:'user1'},{$set:{age:30}}) 给user1的用户添加了一个字段age
$inc 自增
$unset删除不需要的字段xx.xx.update({},{$unset:{score:1}},0,1);删除score字段
$push 压入数据到collections中 xx.xx.update({name:'user1'},{$push:{arr:8}},0,1);
$pushAll 同事压入多个数据 xx.xx.update({name:'user1'},{$pushAll:{arr:[2,32,12,21,1212]}});同时压入多个数据
$addToSet 当表中存在时,就压入,如有重复就不压入 xx.xx.update({name:'user1'},{$addToSet:{arr:12}}) 如果arr中存在12,则不压入,不存在则压入
$pop 删除数组中最后一个元素 xx.xx.update({name:'user1'},{$pop:{$arr:1}});
$pull 只能操作数组 xx.xx.update({name:'user1'},{$pull:{arr:4}})删除数组arr中值为4的键
$pullAll 删除多个xx.xx.update({name:'user1'},{$pullAll:{arr:[4,5]}})同事删除4和5值
$rename更改字段名字xx.xx.update({name:'user1'},{$rename:{arr:'post'}})把arr字段更改为post
$bit 位运算
特殊操作符号 $
{'id':'213','arr':[{'title':'linux'},{'title':'java'},{'title':'php'}]}在arr数组中的title为linux的结果集中添加一个cont字段
xx.xx.update({'arr.title':'linux'},{'arr.$.cnt':'linux is very good!'});
res
{'id':'213','arr':[{'title':'linux','cnt':'linux is very good'},{'title':'java'},{'title':'php'}]}
db.dropDatabase() //删除数据库
db.collections.drop //删除集合
db.createCollection('c1') //穿件一个集合
db.createCollection('c2',{capped:true,size:1000,max:5}) //创建一个固定结合只能放5个json多了就把前面的推出去
db.runCommand({convertToCapped:'c1',size:1000,max:4}); //将c1转化成一个固定集合
GridFS一个大文件系统
./mongofiles put 文件名
./mongofiles get 文件名
./mongofiles delete 文件名
./mongofiles list 列出上传文件
db.fs.files.find(); //查找信息
db.fs.files.remove(); //移除信息
db.fs.chunks.find() //查看源文件
db.fs.chunks.remove() //删除源文件
[性能篇]
查看一个语句的影响行数
db.c1.find({name:'user'}).explain();
增加一个索引
db.c1.ensureIndex({name:true},{background:true}) //在后台建立name的索引
查看索引
db.c1.getIndexes();
查看索引键
db.c1.getIndexKeys();
添加一个唯一索引
db.c1.ensureIndex({age:1},{unique:1}); //给age创建了一个唯一索引
删除索引
db.c1.dropIndex({age:1}) //删除age的索引
db.c1.dropIndexes();//删除所有的索引,除id一歪
[慢查询日志]
启动的时候 添加 --profile=[0,1,2]
0:不记录
1:记录慢查询日志
2:记录所有的日志
添加 --slowms
./mongod --dapath=/usr/local/mongodb/data/ --logpath=/usr/local/mongodb/log/logs.log --profile=1 --slowms=300 --fork
在启动后
> db.getProfilingLevel();
> db.setProfilingLevel(1) //设置开启慢查询
xx.xx.find({},{field1:1,field2:1,field3:1}).sort({field:-1}).limit(8);//查询出结果,返回字段,排序,限制条数
[性能监控]
./mongosniff --source
./mongostat
[管理篇]
数据导入 mangoexport -d dabataseName -c collectionName -o /home/bakName.bak
数据导出 mangoimport -d databasesName -c collections /home/bakName.bak
备份 mongodump -d databaseName
恢复 mongorestore -d databaseName /备份路径文件
[用户授权]
mongod --auth 添加验证选项
user admin //超级管理员
db.addUser('root','luowen');//超级管理员密码
每个数据库一个管理员,只能在这个数据库里面转
[架构篇]
主从复制
Master-Slave 复制(主从)
Replica Sets 复制(副本集)
1.简单的主从
./mongod --master --dbpath=/data1
./mongod --slave --source 主服务器地址ip--dbpath=/data2
2.Replica Sets(副本集复制)
./mongod --replSet rs1 --keyFile=/usr/local/mongodb/key/key1 --dbpath=path/data1
./mongod --replSet rs1 --keyFile=/usr/local/mongodb/key/key2 --dbpath=path/data2 //两个主服务器启动了,在同一个组中rs1中
//配置会议室(随便登入一台服务器)
config_rs1={_id:'rs1',members:[{_id:0,host:"localhost:20001",priority:1},{_id:1,host:"localhost:20002",priority:2}]}
//初始化清单
rs.initiate(config_rs1);
rs.slaveOk();//设置从服务器有读的权限