mogodb 缓存
一、mogodb的认识MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的,因为mongdb做不到关系型数据的连表,外键等操作,它的存储数据方式有点类似于Json格式,Mogodb叫做这种格式叫为Bson(big json),Mongodb是一个面向集合的,模式自由的文档型数据库。1.mongodb与 mysql性能比较下面是官方...
一、mogodb的认识
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的,因为mongdb做不到关系型数据的连表,外键等操作,它的存储数据方式有点类似于Json格式,Mogodb叫做这种格式叫为Bson(big json),Mongodb是一个面向集合的,模式自由的文档型数据库。
1.mongodb与 mysql性能比较
下面是官方的bench-mark数据测试数据:
1.分别插入100万条记录,并对其做100个用户并发查询操作,
Mongodb分片(把大数据拆分为小数据进行复制)数据测试结论:138M/s
2.应用范围和限制
缺点:不支持连表查询,不支持sql语句,不支持事务存储过程等,所以不适合存储数据间关系比较复杂的数据,一般主要是当做一个数据仓库来使用。
适用于:日志系统,股票数据等。
不使用于:电子商务系统等需要连多表查询的功能。
国内职场中应用mongodb最广泛的网站(PHP+Mongodb):youku,tudou,星期五台球网
二、需要掌握的几个概念
1、文档
文档是mongoDB中数据的基本单元,类似关系数据库的行,
多个键值对有序地放置在一起便是文档。
MongoDB 中以文档的方式存取记录,如一条记录格式如下:
{ “username”:”Tom”, “age”:10 ,email:’xiaobai@sohu.com’,’sex’:男}
{ "username":"Tom" , "age" : "10" }
{“Username”:”Tom”,”age”:10}
{“Username”:”Tom” }
注意:
(1)以上是几个不同的文档,MongoDB区分大小写的数据类型,第一个age字段是数字类型,第二个age是字符串类型。
(2)每一个文档尺寸不能超过16M
2、集合
集合就是一组文档,多个文档组成一个集合,集合类似于 mysql里面的表 。
无模式是指,在同一个集合中可以包含不同格式的文档,如:
{ "Name" : "Mongodb" , "Type" : "Nosql" }
{ "UserName" : "Tom" , "age" : 20 , "Gender" : "male" }
以上两个文档可以放在同一个集合中。
在Mysql需要先建表再插入数据,
模式自由(schema-free):意思是集合里面没有行和列的概念,
注意:MongoDB中的集合不用创建、没有结构,所以可以放不同格式的文档。
3、数据库
多个集合可以组成数据库。一个mongoDB实例可以承载多个数据库,他们之间完全独立。
Mongodb中的数据库和Mysql中的数据库概念类似,只是无需创建。
一个数据库中可以有多个集合。
一个集合中可以有多个文档。
4、mongodb的数据体系
三、安装mongodb
1.安装步骤
第一步:通过yum search mongodb,查到mongodb的安装包如下:
第二步:输入yum -y install mongodb mongodb-server进行安装(下载完成大概有123M),安装成功如下图;
第三步:启动mongodb,命令:service mongod start
第四步:使用命令mongo就可以进入mongodb数据库的客户端
四、入门语句
1、创建数据库
语法: use 数据库名称
注意:如果该数据库不存在,则创建,如果该数据库存在,则是切换,如果创建了数据库,没有任何的操作,则会自动删除该数据库。
2.获取当前数据库名称
语法:db
显示当前正在使用的数据库名称
3.查看当前数据库状态
语法: db.stats();
db一般跟您当前所有use的数据库名称一致,比如说,如果您当前ues了一个名为itheima的数据库,那么db就表示为itheima,stats就可以查看当前数据库的状态。
4.查看所有的数据库
语法:show dbs;
查看数据在mongodb里面已经创建的数据库
5、创建集合
注意:mongodb里面的集合是隐式创建,就是无需创建,直接使用。
语法:db.集合名.insert({})该语法意思是,向集合里面,添加文档。
回车不提示任何的错误,那么就代表该集合创建成功
6、查看集合
语法:show tables
显示当前操作的数据库中的所有集合
显示当前数据库的所有集合,当前数据库如果是itheima则显示itheima数据库的所有集合,如果当前的数据库是demo那么就显示demo数据库的所有集合。
7、查询集合里面的文档
语法:
db.集合名.find() 查询所有
db:代表了当前的数据库
db.itcast:代表当前数据库一个 名为itcast的表名或者集合名
find:查找db.itcast集合中所有的文档(记录)。
mongodb默认产生主键,是一种objectid的对象类型。
objectId是mongodb默认产生主键,然而该主键是可以自定义的,自定义的名称一定为_id
比如:要插入一条主键为100的文档,那么代码如下图所示:
db.itcast.insert({_id:100,name:’jimmy’});
注意:如果一个_id已经存在,继续插入重复的_id那么Mongodb就会报错,效果如下:
因此跟Mysql一样Mongodb的主键也是某一个文档(记录)唯一性标识
db.集合名.findOne() 查询第一个文档
注意:findOne永远只会查询集合中的第一个文档(记录)
8、删除集合
语法:db.集合名.drop();
如果返回true代表删除成功,而且删除一个集合会把该集合里面所有文档都删除了
9、删除数据库
语法:db.dropDatabase()
删除一个已经存在的数据库,db与您当前use的数据库相关,那么如果你use了itheima这个数据库,那么db.dropDatabase()删除的就是itheima这个数据库
删除的结果如下:
10、帮助命令
全局帮助命令
语法:help
数据库相关的帮助命令
语法:db.help()
集合相关的帮助命令
语法:db.集合名.help()
五、聚合更新操作
1、添加文档(记录)
语法: db.集合名.insert({k1:’v1’,k2:’v2’…..})
在mongodb数据是一定以Bson的格式存放在文档中的,而文档一定是出现在集合中的添加文档的数据类型是很自由的
加完文档后,不过您是否愿意,mongodb都会为该文档添加一个默认的主键objectId,所以你可以看一下结果:
在添加的文档里面,都有一个’_id’的键,值为对象类型。
ObjectId类型:
每个文档都有一个_id字段,并且同一集合中的_id值唯一,该字段可
以是任意类型的数据,默认是一个ObjectId对象。
ObjectId对象对象数据组成:时间戳 |机器码|PID|计数器
_id的键值我们可以自己输入,但是不能重复
注意:在插入数据的时候,如果_id的值重复则会报错。
由于_id等于100的主键 已经存在,所以重复插入该主键的值就会发生错误
可以使用js代码来完成批量插入文档。
for(var i=1;i<=2000;i++){
db.stu.insert( {name:”stu”+i,number:i} );
}
这时我们想知道上述批量操作是否成功,那么我们需要去统计一下插入的结果,然而我们不知道怎么样才能查看统计的结果的方法,我们可以使用db.集合名称.help()获取帮助,效果如下:
于是测试的结果如下:
db.stu.find().count();
继续查看帮助,发觉有一个方法叫db.集合名称.find().limit(n)
于是测试的结果如下:
db.stu.find().limit(10)
2、删除文档
语法:db.集合名.remove({条件})(不写条件删除所有的文档)
注意:一般删除最后加上条件进行删除,如果不加条件就是删除全部,相当于mysql当中的
delete from 表名,这样的话,有可能会进行误删除
例1:删除stu集合中学号等于5的文档
命令: db.stu.remove({number:5}),测试结果如下:
如果忘记录删除的命令,我们可以通过db.集合名称.help()查找你直觉可以删除的方法
例2:删除 stu集合学号小于7的文档
使用操作符来完成
常用操作符:
$lt(小于) , $lte(小于等于) , $gt(大于) , $gte(大于等于)
less than简写为:lt,小于的意思
less than equls 简写为:lte ,小于等于的意思
great than 简写为:gt,大于的意思
great than equls:简写为:gte,大于等于的意思
语法:db.stu.remove( {字段名:{条件}} );
代码: db.stu.remove( {number:{‘$lt’:7}} );
- 更新文档
1.使用set修改器修改文档
语法:db.集合名.update({条件},{‘$set’:{修改的键:修改的新值}})
比如:把MeggieQ的名字改为Meggie Lee
2.
使用inc修改器修改文档
语法:db.集合名.update({条件},{‘$inc’:{修改的键:修改的新值}})
inc修改一般大多数情况下是拿来对整形进行加操作
比如:对林志玲加3岁就可以使用inc修改
比如:对林志玲做减去2岁也可以使用inc修改
4.批量更新
在mongodb当中,mongodb很特殊,它只能每一次修改一条记录,如果修改的时候有多条记录符修改的条件,它也只会默认修改最前面的一条,效果如下图所示:
需求:把年龄18岁的人的学科都改为thinkphp,代码如下所示:
db.demo.update( {age:18},{'$set':{lesson:'thinkphp'}} );
发觉以上的代码无法完成我们的需求,这时,我们需求使用以下格式进行批量更新
语法:
db.demo.update( {条件},{'$set':{字段:值}},更新的默认状态,是否启动批量更新);
说明:
更新的默认状态:如果为true默认更新1条记录,如果有多条记录复合更新的条件那么就更新最前面的一条,默认为true
是否启动批量更新:如果是true代表启动,如果是false就代表不启动,默认false
如果需要批量更新,语法格式如下:
db.demo.update( {条件},{'$set':{字段:值}},false,true);
比如:把年龄为18岁的学生的学科全部改为laravel
db.demo.update( {age:18},{'$set':{lesson:'laravel'}},false,true );
六、mongodb的聚合查询文档
语法:db.集合名.find({条件})
案例1:取出stu集合里面第一个文档
语法:db.集合名称.findOne();
案例2:取出stu集合里面学号为100的文档
语法:db.集合名称.findOne({条件});
语法:db.集合名称.find({条件});
注意:如果您确定所查找的记录有且只有一条,那么使用findOne方法的效率会高于find方法,因此建议在查找一条记录时用findOne取代find
案例3:取出stu集合中学号大于或等于1997的学生
使用操作符来完成
常用操作符:
$lt(小于) , $lte(小于等于) , $gt(大于) , $gte(大于等于)
less than简写为:lt,小于的意思
less than equls 简写为:lte ,小于等于的意思
great than 简写为:gt,大于的意思
great than equls:简写为:gte,大于等于的意思
语法:db.stu.find({字段名:{操作符:条件}})
代码:db.stu.find( {number:{'$gte':1997}} );
假设把需求修改一下:查找学号大于或者等于1997的学生,但值读出查找的记录的前面2条,这时需求把代码修改成以下这个结果:
代码:db.stu.find( {number:{'$gte':1997}} ).limit(2)
假设再把需求修改一下:查找学号大于或者等于1000的学生,这时由于查找的学生有可能是很多的,这时我可能只想知道学号大于或者等于1000的学生有多少人,这时需求代码应该修改成以下这种结果:
代码:db.stu.find( {number:{'$gte':1000}} ).count();
案例4:取出stu集合中名为stu999的信息记录,且只显示其姓名
语法:db.集合名称.find({条件},{字段:1/0});
说明:
{字段:1} : 代表只显示该字段
{字段:0} : 代表不限该字段,但显示该字段以外的所有的字段
代码:db.stu.find({name:’stu999’},{name:1})
注意:您只显示某一字段,但是mongodb默认的主键objectId也会跟随一起显示
语法:db.集合名称.findOne();
假设把需求修改为:查找一条名为stu999的学生,只显示其学号,我们可以有两种方法对其进行显示
代码:db.stu.findOne({name:’stu999’},{name:0})
代码:db.stu.findOne({name:’stu999’},{number:1}),该代码是最精准的方法
更多推荐
所有评论(0)