1.什么是NoSQL
Not Only SQL,以key-value形式存储,json形式的key-value,分布式,开源的,水平可扩展。
NoSQL->新浪微博:Redis
Google:Bigtable
Amazon:SimpleDB
淘宝数据平台:Tair
视觉中国网站:MongoDB
优酷运营数据分析:MongoDB
飞信空间:HandleSocket
豆瓣社区:BeansDB
2.MongoDB:介于关系型数据库和非关系型数据库之间的产品,面向集合的,文档型数据库。
主要特性:自动支持云计算,面向集合,支持动态查询,支持完全索引,支持复制和故障恢复,使用高效的二进制数据存储,包括大型对象,自动处理碎片,支持云计算层次的扩展。,文件存储格式为BSON。(一种JSON的扩展)
适用的场景:持久化的缓冲层,高效的实时性,用于对象及JSON数据的存储,
不适用的场景:要求高度的事务性,复杂多表查询,传统的商业智能应用。
3.MongDB的安装
安装:Http://www.mongodb.org
http://fastdl.mongodb.org/linux/mongodb-linux-1686-1.8.0.tgz
解压压缩包上传到linux中,放到/usr/local/mongdb
mv mongdb/usr/local/mongodb
创建数据库文件夹和日志文件:安到/usr/local下
创建一个data目录:mkdir data
touch dblogs
mkdir/usr/local/mongodb/data
touch/usr/local/mongodb/dblogs
日志文件
将mongodb启动项目加入rc.local保证mongodb在服务器开机时启动
4.
启动(./mongod是启动程序):./mongod --dbpath /user/local/mongodb/data/ --logpath=/usr/local/mongodb/dblogs --fork
5.查看进程列表:
pstree -p grep mongod
vi /etc/rc.local
/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data/--logpath=/usr/local/mongdb/dblogs--fork'>>/etc/rc.local
6.关闭mongdb :
1.pkill mongod
2.killall mongod
ps -ef|grep mongod
不用kill -9 2596,若用kill -9 则再用ps -ef |grep mongod
起不来mongo了,此时删掉mongod的锁: cd data/
rm -rf mongod.lock
cd bin/
./mongod --dbpath=/usr/local/mongodb/data/ --logpath=/usr/local/mongodb/dblogs--fork
!ps
(启动命令常用参数选项说明:
--dbpath:指定数据库目录
--port:指定数据库的端口(27017)
--bind_ip:绑定ip
--directorypcrdb:为每个db创建一个独立子目录。
--logpath:指定日志存放目录
--logappend:指定日志的生成方式
--keyFile:集群模式的关键标识
--maxConns:最大并发连接数
--journal:启用日志
--pidfilepath:指定进程文件路径,若不指定,不产生进程文件
--fork:以后台Daemon形式运行服务
--keyFile集群模式的关键标示
--notablescan不允许进行表扫描
--noprealloc关闭数据文件的预分配功能
mongod --help查询帮助)
./mongo:默认有一个空数据库local
mongodb创建数据库和表:是隐式创建
kill -2杀死进程(别用kill -9)
7.MongoDB的插入insert
show tables;
system.indexes
db.c1.find();
db.c1.insert({name:"user2"});
db.c1.find();
db.c1.remove();
db.c1.update({name:"user3"},{$set:{name:"user30"}});
db.c1.find();
db.c1.update({name:'user3'},{$set:{name:'user300'}});
db.c1.update({name:'user30'},{$set:{sex:"nan"}});
db.c1.find();
db.user.update({"id":1},{"name":"nosql"});
db.c1.insert({name:"user3",age:30});
db.c1.remove();
db.users.remove({"_id":1,"name":"nosql"}{"_id":ObjectId("4eb2a"),"age":24})
定义一个函数:让它实现id自增
function counter(name){
var ret=db.counters.findAndModify({query:{_id:name},update:{$inc:{next:1}},"":true,upset:true});
}
db.users.insert({_id:counter("users"),name:"id2"});
db.users.insert({_id:counter("users"),name:"id2"});
8.增删改查:
固定集合:Capped Collection
GridFS(大文件上传下载,只有MongoDB出现)
Mongodb是面向文档存储的数据库,文档结构形式叫BSON(类似JSON)
1.(1)insert
(2)save
(区别若_ID相同则更新,而insert则插入失败)
db.c1.find();
db.c1.insert({_id:1,name:"user5"});
db.c1.save({_id:1,name:"user6"});
db.c1.remove();
db.c1.insert({name:"user1",post:{tit:1,cnt:111}});
db.c1.find();
db.c1.insert({name:"user2",post:{1,2,3,4,5}});
2.删除
db.c1.remove({});
db.c1.remove();
上两条等同
db.c1.insert({name:"user1"});
db.c1.insert({name:"user2"});
db.c1.insert({name:"user3"});
db.c1.remove({name:"user1"});
3.查询
1).查询所有和带条件的
db.c1.insert(name:"user1");
for(i=1;i<10;i++){
... db.c1.insert({name:"user"+i})
...};
db.c1.find();
db.c1.find({});
db.c1.find({name:"user1"});
db.users.find({},{age:0});
db.users.find({'last_name':"smith"});
{'last_name':'smith'}是条件
查询选项:
select name,age,sex,score from t1 where name="user5";
db.c1.find({name:"user5"});
db.c1.insert({name:"user11",age:20,sex:"nan"});
db.c1.find({name:"user1",name:1,age:1});
db.c1.find({name:"user11",name:1});
db.c1.find({name:"user1"},{name:1,_id:0});
条件表达式:
大于:
小于:
等于;
大于等于:
小于等于:
db.c1.remove();
for(i=1;i<10;i++){
...db.c1.insert({name:"user"+i,age:i})}
db.c1.find({age>5});
db.c1.find({age:{$gt:5}});
db.c1.find({age:{$lt:5}});
db.c1.find({age;{$gte:5}});
db.c1.find({age;{$lte:5}});
db.c1.find({age:{$ne:q}});//$ne:不等于
db.c1.find().count();
db.c1.find();
db.c1.find().sort({age:1});
db.c1.find().sort({age:- 1});
db.c1.find().limit(4);
db.c1.find().limit(0,4);
./mongo
db.c1.find().skip(5).limit(5);//跳过5个取5个
db.c1.find().skip(1).limit(4).sort({age:-1});
db.c1.find().sort({age:-1}).skip(2).limit(2).count(0);
//count为0 看不见前面的条件
db.c1.find().sort({age:-1}).skip(2).limit(2).count(1);
//count为1 看得见前面的条件
9.魔术方法
1)$all:包含(若包含则显示,若有一个不包含则不显示)
db.c2.insert({name:"user1",post:[1,2,3,4,4]});
db.c2.find({post:{$all:4,6}});
db.c2.insert({name:"",post:[1,2,3,4,5]}});
db.c2.find({post:{$all:[4,6]}});
db.c2.find({post:{$all:[4,6]}});
db.c2.find({post:{$all:[1,2,3]}});
db.c2.find({post:{$all:[1,2,4]}});
db.c2.find({post:{$all:[1,3,5]}});
2)$exists:判断一个字段是否存在
db.c2.find({age:{$exists:1}});
db.c2.find({name:{$exists:1}});
db.c2.find({post:{$exists:1}});
3)$mod
db.c1.find({age:{$mod:[2,1}});//取余余数为2,为1的
4)$ne
6)$in
db.c1.find({age:{$in:[1,3,5]}});
db.c1.find({age:{$in:[1,3,6]}});
7)$nin:查询过程中出现[]
db.c1.find({age:{$nin:[1,2]}});
8)$or
db.c1.find({name:"user2"});
db.c1.find({name:”user2“,age:29});
db.c1.find({$or:[{"user1",name:"user2",name:"user3"}]});
db.c1.find({$or:[{name:"user2"},{name:"user3"}]});
db.c1.find({$or:[{name:"user2"},{age:8}]});
9)$nor
db.c1.find($or:[{name:"user2"},{age:8},{age:10}]);
db.c2.insert({name:"user2",post:[4,5,6,7,8]});
db.c2.insert({name:"user4",post:[9,10]});
db.c2.find({post:{$size:3}});
db.c2.find({post:{$size:5}});
正则表达式
db.c1.find({name:"user"});
db.c1.find({name:/user2/i});
7)distinct
select distinct name from t1
db.c1.distinct;
db.c1.distinct(name);
db.user.find().skip(10);
db.user.find().limit();
9)$elemMatch元素匹配
db.c1.distinct("age");
db.c3.insert({name:"user1",post:[{"tit":1},{"tit":2}]});
db.c3.insert({name:"user2",psot:[{"tit":aa},{"tit":bb},{"tit":cc}]});
db.c3.find({post:{$elemMatch:{tit:2}}});
db.c3.find({post:{$eleMatch:{tit:2,tit:3}}});
db.c3.find({post:{$eleMatch;{tit:"bb",tit:"cc"}}});
10.游标:
Cursors游标及Cursor Methods
遍历游标;
x=db.c1.find();
var x=db.c1.find();
var x=db.c1.finxd();
x.hasNext();//连接数据库
x.next();//拿值
sort(1)
sort(-1);
db.user.count(1);
db.c1.find().count(1);
db.user.find().count(1);
$query/$orderby/
13)null
db.c4.insert({name:"user1"});
db.c4.insert({name:"user2",age:null});
db.c4.find({age:$null});
db.c4.find({age:{$exist:1}});
db.c4.find({age:{$exist:1,$in:[null]}});
db.c4.find({age:{$type:10}});
db.c4.find({age:{$exists:false}});
8)$slice:针对数组
db.c3.find({name:"user1"},{post:{$slice:1}});
db.c3.find({name:"user1"},{post:{$slice:[2,3]}});
9)update
db.c3.update(
{name:"user3"},{name:"user300"},1);
db.c4.save();
show tables;
db.c1.find();
db.c5.upate({name:"user1"},{$set:{name:"user111"}},0,1);
db.c5.update({name:"user1"},{$set:{age:10}},0,1);
10) $inc
db.c5.find();
db.c5.insert({name:"user2",age:320,});
db.c5.update({name:"user4"},{$inc:{score:10}});
db.c5.update({name:"user4"},{$inc:{score:-10}});
11) $unset
db.c5.update({}{$unset:{score:1,age:1}},0,1);
db.c5.update({},{$unset:{name:1}},0,1);
db.c5.insert({name:"user1",arr:[1,2,3]});
12)$push db.c5.update({name:"user1"},{$push:{arr:4}});
13)$pop db.c5.update({name:"user3"},{$pop:{arr:1}});
14)$pushAll db.c5.update({name:"user4"},{$pushAll:{arr:[4,5,6]}});
15)$addToSet db.c5.update({name:"user1"},{$addToSet:{arr:4}});
db.c5.update({name:"user1"},{$addToSet:{arr:5}});
db.c5.update({name:"user1"},{$addToSet:{arr:{$each:[3,5,6]}}});
16)$pushAll db.c5.update({name:""},{$pullAll:{arr:}});
17)$pull
db.c4.update({name:"user2"},{$pull:{arr:5}});
18)$rename
db.c4.update({name;"user1"},{$rename:{arr:"post"}});
11.特殊操作符:$
db.c5.update({"arr.tit":"linux"},{$set:{"arr.$.cnt":"linux is very much"}});
var x=db.c1.find({name:"user10"});
x
x.sex="nan"
x.score=20
x
x.flower=yes
db.c1.save(x);
db.c1.find();
mongoDB性能篇
一.Capped Collection固定集合
system.indexs
db.c5.drop();
show tables;
system.indexes;
show dbs
db.dropDatabase();
db.createCollection("c1");
show tables;
db.c1.drop();
db.c1.stats();
show tables;
system.indexes;
capped:true;
db.createCollection("c2",capped:true,size:1000000,max:5);
db.c2.stats();
db.c2.insert({name:"user1"});
db.c2.insert();
将普通集合转为固定集合
db.runCommand({convertToCapped:"c1",size:10000,max:3});
GridFS(存储视频和高清图片的)
不产生磁盘碎片
GridFS:files和chunks
fs.files fs.chunks
mongofiles -h
./mongofiles list
tar czf mongosniff.tar.gz mongosniff
./mongofiles put mongosniff.tar.gz
./mongofiles list
rm -rf mongosniff
rm -rf mongosniff.tar.gz
./mongofiles list
du -sh mongosniff.tar.gz
tar xzf mongosniff.tar.gz
./mongofiles delete mongosniff.tar.gz
./mongofiles list
./mongo
db.fs.chunks
12.索引管理:根据字段提高操作速度
性能优化:
性能监控:
建立索引:
./mongo
db.fs.chunks.drop();
db.fs.c1.drop();
db.system.indexes.find();
for(){
...db.c1.insert(name:"user"+i,age:i);
...}
db.c1.find();
db.c1.find({name:"user4"}).explain();
增加一个索引:
db.persons.ensureIndex({name:1},{background:true});
db.c1.getIndexKeys();
db.c1.getIndexes();
db.c1.ensureIndex({age:1},{unique:1});
db.c1.getIndexKeys();
db.c1.getIndex();
db.c1.dropIndexes({$});
db.c1.dropIndex({$firstname:1});
13.explain():影响行数
优化器:profile
慢查询日志功能:
--profile--
:取0,1,2
默认
开启慢查询:
db.setProfilingLevel();
db.setProfilingLevel(1);
db.setProfilingLevel(1,1000);
--slowms
db.getProfilingLevel(1,10)
(三)性能监控:
1.mongosniff记录通讯记录
./mongosniff--source net lo//lo为回环接口
./mongostat
./mongo
db.c1.find();
db.posts.find();
(四)mongoDB管理篇
数据的导入导出,数据备份,数据恢复,用户安全与认证
数据导入:
mongoexport
数据导出:
mongoimport
./mongoexport -d test -c c1 -o /tmp/c1.out
cat c1.out
cd -
function(){
returnnativeHelper.apply(ls_,arguments);
}
./mongoimport -d test -c c1/tmp/c1.out
show tables;
db.c1.stats();
db.c1.count();
db.c1.insert({name:"user11"});
数据备份,数据恢复
cd data/
ls
cd test
ls
cd..
ls
cd bin/
备份:./mongodump -d test -o /tmp/test/
./mongodump -d test -o /tmp/
rm -rf /tmp/test/
./mongodump -d test -o /tmp
./mongorestore -d test/tmp/test
./mongo
db.c1.find();
./mongodump -d test -c c1 -o /tmp/
tree test/c1.bson
./mongo
/tmp/test/c1.bson
(五)用户授权:
./mongod --auth(用户授权)
./mongo (超级管理员登陆的)
pkill mongod
pstree |grep mongod
cat /etc/rc.local
/usr/local/mongodb/bin/mongod --auth --dbpath=/usr/local/mongodb/data/ --logpath=/usr/local/mongodb/dblogs --fork
use test
show tables
system.indexes
use admin
show tables
db.addUser("root","123");
show tables;
db.addUser("root","123");
show dbs;
./mongo -uroot -p123 localhost:27017/test
./mongo -uroot p123 localhost:27017/admin
system.users
db.auth("user1","123");
system.tables
./mongo -user1 -p123 localhost:27017/test
show tables
./mongod --auth(一定要写)
./mongo
(六)架构篇
主从复制,副本级
Master-Slave(主从);
Replica Sets(副本级);
./mongo
pkill mongod
pstree|grep mongo
rm -rf data/dblogs
mkdir data1 data2
cd bin/
./mongod--master --dbpath=/usr/local/mongodb/data1/ --logpath=/usr/local/mongodb/dblog1 --fork --port 20001
./mongod --slave --source 127.0.0.1:20001
./mongod --slave --source 127.0.0.1 --dbpath-usr/local/mongodb/data2/ --logpath
./mongo --port 20001
show tables;
show tables;
db.c1.insert({name:"user1"});
show tables;
c1
systme.indexes