zoukankan      html  css  js  c++  java
  • 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、特殊操作符:$

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

  • 相关阅读:
    图论概况
    [NOI2006]最大获利
    Dining
    [USACO5.3]校园网Network of Schools 缩点
    I Hate It
    [USACO06JAN]牛的舞会The Cow Prom Tarjan
    爱在心中
    [HAOI2006]受欢迎的牛
    泥泞的道路
    上白泽慧音
  • 原文地址:https://www.cnblogs.com/yuyangphpweibo/p/7911827.html
Copyright © 2011-2022 走看看