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

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

  • 相关阅读:
    POJ 3710 Christmas Game#经典图SG博弈
    POJ 2599 A funny game#树形SG(DFS实现)
    POJ 2425 A Chess Game#树形SG
    LeetCode Array Easy 122. Best Time to Buy and Sell Stock II
    LeetCode Array Easy121. Best Time to Buy and Sell Stock
    LeetCode Array Easy 119. Pascal's Triangle II
    LeetCode Array Easy 118. Pascal's Triangle
    LeetCode Array Easy 88. Merge Sorted Array
    ASP.NET MVC 学习笔记之 MVC + EF中的EO DTO ViewModel
    ASP.NET MVC 学习笔记之面向切面编程与过滤器
  • 原文地址:https://www.cnblogs.com/yuyangphpweibo/p/7911827.html
Copyright © 2011-2022 走看看