Mongodb学习笔记(一)
一、Mongodb特性:
特性:
面向集合:数据备份组储存在数据集中被称为一个集合。
模式自由:集合里面没有行和列的概念。
文档型:我们储存的数据是键-值对的集合,键是字符串,值可以是数据类型集合里的任意类型,包括数组和文档,每一个文档相当于关系型数据库中的一条记录。
支持动态查询
支持完全索引,包含内部对象
支持复制和故障恢复
使用高效的二进制数据存储,包括大型对象(如视频等)
自动处理岁票,以支持云计算层次的扩展性
文件存储格式为BSON(一种json的扩展)
特点:高性能、易部署、易使用存,储数据非常方便
适用场景:
持久化缓存层
搞笑的实时性
用于对象及JSON数据的存储
高伸缩性的场景
大尺寸,低价值的数据库
不适用场景:
要求高度事务性的系统。
传统的商业智能应用
复杂多表查询
二、MongonDB的安装
1、下载:
官网:www.mongodb.org
命令:wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.4.tgz
2、解压:tar xzf mongodb-linux-x86_64-3.0.4.tgz
3、安装:
1)进入mongodb-linux-x86_64-3.0.4内,将bin拷贝到/usr/local/mongodb下
rsync -a bin /usr/local/mongodb
2)在mongodb目录下新建data目录,用来放置mongodb储存的数据,创建dblogs文件放日志文件。
mkdir data
touch dblogs
4、开机启动:
将mongodb启动项加入到rc.local保证mongodb在服务器开机时启动
echo "/usr/local/mongodb/bin/mongodb --dbpath=/usr/local/mongodb/data" >>/etc/rc.local
--dbpath:执行数据库存放路径
5、启动mongodb
运行mongod命令
/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data --fork --logpath=/usr/local/mongodb/dblogs
--dbpath:执行数据库存放路径
--fork是以Daemon(进程)方式运行
(注意:如果指定--fork参数,必须指定--logpath日志文件路径)
检查进程:
pstree -p |grep mongod
开机启动:将启/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data --fork --logpath=/usr/local/mongodb/dblogs加入到rc.local文件中,
vim /etc/rc.local
启动项说明:http://blog.csdn.net/fdipzone/article/details/7442162
6、关闭:
pkill mongod或者killall mongod
三、进入客户端操作
1、进入mongodb
/usr/local/mongodb/bin/mongon(执行mongon命令)
查看数据库:show dbs
查看当前数据库:db
查看当前数据库有多少数据:show tables;或者show collection;
定义一个叫c1的集合并插入数据:db.c1.insert({name:"user1"}); //同时会创建一个名字为当前数据库名字的数据库,同时创建这个集合
查看c1集合的内容:db.c1.finf();
查看集合状态:db.c1.stats();
删除集合:db.c1.drop();
删除数据库:db.dropDatabase();
删除集合里面的内容(删除全部):db.c1.remove();
修改:
db.c1.update({'原键','原值'},{'目的键','目的值'}); //会将原来的其他键值对删除掉
db.c1.update({'原键','原值'},{$set:{'目的键','目的值'}}); //不会影响其他键值对
2、退出:exit
四、MongoDB的体系结构
1、逻辑结构关系对比:
关系型数据库:MySQL数据库(database)、表(yable)、记录(rows)三层次概念组成
非关系型数据库:MongoDB数据库(database)、集合(collection)、文档对象(document)三个层次概念组成。
MongDB里的集合对应于关系型数据库里的表,但是集合中没有列、行和关系的概念,集合中只有文档,一个文档就相当于一条记录,这体现了模式自由的特点。
2、数据存储结构
MySQL的数据存储结构:
MySQL的每个数据库存放在一个与数据库同名的文件夹中,MySQL如果使用MyISAM存储引擎,数据库文件类型就包括.frm、.MYD、.MYI
MongoBD的数据存储结构:
MongoDB的默认数据库目录是/data/db,它负责存储所有的MongoDB数据文件。在MongodDB内部,每个数据库都包含一个.ns文件和一些数据文件,而且这些数据文件会随着数据量的增加而变得越来越多。所以如果系统中又一个叫做mydb的数据库,那么构成mydb这个数据库的文件就会由mydb.ns,mydb.O,mysql.l等等组成。
3、MongoDB数据类型
Mongodb的文档使用BSON(Binary JSON)来组织数据,BSON类似于JSON,JSON只是一种简单的表示数据的方式只包含了6中数据类型(布尔、数字、字符串、数组及对象),不能完全满足复杂的业务需求,因此,BSON还提供日期、32为数字、64为数字等类型。以下对mongoDB的数据类型进行简要说明:
1、null
null类型用于标示空置或不存在的字段
如:{"one":null}
2、布尔类型
布尔类型有两个值,“true”和“false”
如:{"one":true}
3、32位整数
mongoDB的控制台使用JS引擎进行输入,而JS仅支持64位浮点数,所以32为整数将会被自动转义。
4、64位整数
64为整数与32为整数一样,在MongoDB控制台使用时,会转义64位浮点数。
5、64位浮点数
MongoDB控制台数字的默认类型。
如:{"one":2.02} {"one":10}
6、字符串
UTF-8字符串都可以标示为字符串类型的数据。
如:{"one":"hello world"}
7、符号
在MongoDB控制台中不支持这种类型,将自动转义成字符串。
8、ObjectID类型
对象id是文档中唯一的12位的ID
0|1|2|3|4|5|6|7|8|9|10|11
时间戳 |机器 |PID |计数器
如:ObjectID("4eae239f63520362e051e7fd")
9、日期
注意:使用的时候要加上new
如:{"one":new Date()}
10、正则表达式
文档键值可以办函正则表达式,其正则表达式可以采用JS语法来表示。
如:{"one":/ho/i}
11、代码
文档中可以包含JS代码
如:{"one":function(){....}}
12、数组
文档中键值可以标示数组,在数组内还可以嵌套数组
如:{"X":['a','s',['d','f']]}
13、内嵌文档
文档可以包含别的文档,也可以作为值潜入到父文档中。
如:{"x":{"name":"user"}}
五、常用命令
控制台中的基本操作命令
db;:查看当前连接的数据库
db.system.users.find();:查看用户列表
show users;:查看所有用户
show dbs;:查看所有数据库
show collections;:查看所有集合
db.dropDatabases();:删除当前的数据库
db.集合名称.drop();:删除collection
hellp;:查看mongoDB支持的命令
db.hellp;:查看当前数据库支持的方法
db.集合名称.help();:查看当前集合支持的方法
use mydb;:定义新的数据库名,没有真正建立这个数据库
db.c1.count();/db.c1.find().count():查看c1里有多少条数据
参数:0/1,默认为0,不看前面的条件
六、MongoDB之增删改查。
1、插入---insert和save在主键不冲突的情况下效果一样
insert:db.c1.insert({键,'值'}); //主键冲突时会报错,插入不成功
save:db.c1.save({键:"值"}); //主键冲突时会更新数据,
可以将游标操作的数据直接存入。
如:var x=db.c1.find(name:"user");
x.ses="nan"
x.score=20
x.flower="yes"
db.c1.save(x)
可以用js的方法循环插入
如:for(i=1;i<10;i++){
db.c1.insert({name:"user"+i});
}
2、删除---remove
全部删除:db.c1.remove({}); //相当于里面是空json,标示只要是json就删除
有条件的删除:db.c1.remove({键:"值"});
3、查询:find
查询全部:db.c1.find(); //相当于空json
条件查询:db.c1.find({键:"值"});
查找需要的列:db.c1.find({键:'值'},{name:1}); //只要name这一列,后面还可以加,如{name:1,age:1}
条件表达式(魔术方法)
1)<,<=,>,>=,=,!=
db.c1.find({age:{$gt:5}}); //查找年龄大于5的
db.c1.find({age:{$lt:5}}); //查找年龄小于5的
$gte //大于等于
$lte //小于等于
$ne //不等于
2)排序:sort
db.c1.find().sort({键:1}); //升序
db.c1.find().sort({键:-1}); //降序
3)取出数量:limit
db.c1.find().limit(3); //从0开始取出3个
取出一段:配合skip
db.c1.find().skip(1).limit(3); //跳过一个取5个
4)查找数组里包含值的数据(in)----$all
db.c2.find({键:{$all:[1,2,3]}}); //查找包含数组1,2,3的数据
5)检查一个字段是否存在----$exists
db.c1.find({键:{$exists:1}}); //查找这个键是否存在
6)取模,不需要where子句----$mod
//where子句
db.c1.find("this.age%2==1");
//$mod操作
db.c1.find({age:{$mod:[2,1]}}); //取年龄除以2余1的数据
7、在数组中(where_in)----$in
db.c2.find({键,{$in:[1,2,3]}});
8、不在数组中(not_in)---$ne
db.c2.find({键:{$ne:[1,2,3]}});
9、或者---$or
db.c1.find({$or:[{name:"user2"},{name:"user3"}]});
10、除了---$nor
db.c1.find({$nor:[{name:"user1"},{name:"user2"}]});
11、查询数组长度等于参数的数组(数组元素的个数)---$size
db.c2.find({post:{$size:3}}); //查找post字段长度为3的数组
12、正则表达式(js正则)
db.c1.find({name:/user/i});
13、取唯一值,重复值去掉---distinct
db.c1.distinct("name");
14、分页查询
db.c1.find().skip(跳过条数).limit(查询条数)
15、查找json中的子json---$elemMatch
db.c3.find({post:{$elemMatch:{tit:2}}}); //查找post下的子集合中tit为2的集合
16、null查询
db.c1.find(age:{$exists:1,$in:[null]});或者
db.c1.find({age:{$type:10}});
17、截取多少条数据(针对数组)---$slice
db.c1.find({name,"user"},{post:{$slice:2}}); //取前两条
db.c1.find({name,"user"},{post:{$slice:2}}); //取最后两条
db.c1.find({name,"user"},{post:{$slice:[1,2]}}); //从第一条开始取两条
4、改---Update
语法:db.collection.ypdate(criteria,objNew,upsert,multi)
参数说明:
criteria:用于设置查询条件的对象
objNew:用于设置更新内容的对象
upsert:如果记录已经存在,更新它,否则新增一个记录,这个参数一般为0
multi:如果有多个符合调价的记录,全部更新。这个参数一般为1且只能配合魔术变量使用
注意:默认情况下,只会更新第一个符合条件的记录。
例:
db.c1.update({name:"user"},{age:25}); //将name=user改为age=25,没有的话会新增
db.c1.update({name:"user"},{name:"user1"},0); //将name=user的改为name=user1,如果不存在不会新增
注意:上述用法会将已有的json换成一个新的json!!!
db.c1.update({name:"user"},{$ser:{age:25}},0,1); //将匹配到的全部更改,匹配不到的不新增,不影响原来的json的其他数据,当数值为负数的时候则做减法
1、$inc
db.c1.update({},{$inc:{core:10}},0,1); //匹配所有的集合,将core字段的数据加10,如果没有这个字段则创建这个字段
2、删除字段---$unset
db.cq.update({name:"user"},{$unset:{ses:1}},0,1);
3、将单个值追加到数组中---$push
db.c1.update({name:"user"},{$push:{arr:4}}); //将数据追加到匹配到的数组中,arr原来不存在则新增,原来存在却不是数组则报错
4、将多个值追加到数组中---$pushAll
db.c1.update({name:"user"},{$pushAll{arr:[1,2,3]}})
5、将值插入到数组中,并去重---$addToSet
db.c1.update({name:"user"},{$addToSet{arr:4}})
6、将多个值雅茹到数组中,并去重.需配合$addToSet使用---$each
db.c1.update({name:"user"},{$addToSet:{arr:{$each:[7,8,9]}}})
7、将数组的最后一个值弹出去---$pop
db.c1.update({name:"user"},{$pop:{arr:1}}); //-1为删除数组中的第一个元素
8、删除符合条件的数组元素---$pull
db.c1.update({name:"user"},{$pull:{arr:1}}) //删除数组中值为1的元素
9、一次性删除多个数组中的元素---$pullAll
db.c1.update({name:"user"},{$pullAll:{arr:[1,2,3]}})
10、修改字段名---$rename
db.c1.update({name:"user"},{$rename:{"age":"post"}})
11、特殊操作符:$
$操作符代表查询记录中第一个匹配条件的记录项。