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