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、特殊操作符:$

          $操作符代表查询记录中第一个匹配条件的记录项。

原文地址:https://www.cnblogs.com/yuyangphpweibo/p/7911827.html