一、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. 更新文档

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}),该代码是最精准的方法

 

 

 

Logo

更多推荐