zoukankan      html  css  js  c++  java
  • mongodb常用数据操作

    1. shell操作

    mongodb默认连接的是test数据库, 输入db,可以看到当前数据库为test, 接下来是常用的数据库操作

        mongodb存储按照文档方式存储,各种操作均采用json格式串进行,

            可以理解为. mongodb的集合就是关系数据库的表,集合里面可以装各种类型的数据,包括集合.

        show databases:显示数据库以及数据库所占空间. 简写为show dbs;

        use [dbname]: 选择数据库

        show collections:当前数据库的集合(表)

        //通过连接端关闭mongodb服务端

        use admin;

        db.shutdownServer();

       

    2. 数据操作

        mongodb中数字类型的key也会当做字符串存储,而value则会区分数字和字符串. 例如: 键值对{"1":23}和{1:23}是相同的,{1:23}和{1:"23"}是有区别的

        数据操作采用: 数据库.集合.命令();里面的数据采用json的扩展(Bson)形式。

        增: insert ; 没有批量插入,可在代码中写一个for循环,而mongodb支持javascript语法,所以, 你懂的。

            插入数据后, 系统默认增加一个字段"_id",保证数据的唯一性。

            db.user.insert({name:"lilei",age:"30"});

            db.user.insert({name:"hanmeimei",age:"28"});

            批量示例:

               

       

        查: find ;

            mongodb的shell端就是一个js语法编辑器, 即js语法mongodb完全兼容.

            支持精确查询(=), 正则表达式模糊查询(/^.....$/), 匹配查询(>, >=, <, <=, != ; OR,In,NotIn)

            1. 精确查询不用多说,通过文档片匹配数据,相同的则查询出来

            2. 正则表达式:js的正则表达式,灰常强大.

            3. 匹配查询: mongodb对于>或者<都是不能识别的,要用转义符

    >

    >=

    <

    <=

    !=

    $gt

    $gte

    $lt

    $lte

    $ne

                

    or

    in

    notin

    $or

    $in

    $nin

            db.user.find(); //查询所有

            db.user.find({name:"lilei"}); //精确查询

            db.user.find({name:/^jim/}); //正则表达式

            //匹配查询,注意写法!!!

            db.user.find({age:{$gt:20}});

            db.user.find({age:{$gte:28}});

            db.user.find({age:{$lt:28}});

            db.user.find({age:{$lte:28}});

            db.user.find({age:{$ne:28}});

            db.user.find({name:/^j/,age:{$in:[14,16]}});

            db.user.find({name:/^j/,age:{$nin:[14,16]}});

            db.user.find({$or:[{name:/^j/},{name:"lily"}]});

        改:    update ;

            mongodb的更新分为三种:全量更新,局部更新,批量更新

            update({匹配片段},{更新片段},upsert,是否批量);

            1. 全量更新

                db.user.update({name:"lily"},{name:"lily",age:27});    //会将匹配name="lily"的第一个片段更新为后面的

           

            2. 局部更新

                例如, 我要将片段{name:"lily",age:30}中的age更新为20, 按照上面的方式, 第二个参数需要写全量, 显然不现实.

                $set,直接设置更新的字段; $inc, 在更新字段上增量更新.

                db.user.update({name:"jime"},{$set:{age:32}});    //设置age=32

                db.user.update({name:/^jim/},{$inc:{age:1}});    //在原有age上+1

           

            3. 批量更新

                第三个参数: upsert(true or false)

    upsert操作就是说:如果我没有查到,我就在数据库里面新增一条,其实这样也有好处,就是避免了我在数据库里面判断是update还是add操作,使用起来很简单将update的第三个参数设为true即可。

           

    在mongodb中如果匹配多条,默认的情况下只更新第一条,那么如果我们有需求必须批量更新,那么在mongodb中实现也是很简单的,在update的第四个参数中设为true即可。

                db.user.update({name:/^jim/},{$inc:{age:1}},true,true);

        删:remove

            db.user.remove(); //删除所有

            db.user.remove({name:"lily"});    //删除匹配

    3. 聚合函数

        count    计数

            db.user.count();//所有

            db.user.count({name:"jim"});    //符合条件

       

        distinct    去重

            db.user.distinct("age");    //注意要加引号了.

       

        group    分组

            这个函数有些复杂,group操作本质上形成了一种"k-v"模型,下图按照age进行group操作,value为对应age的姓名。下面对这些参数介绍一下:

           key:  这个就是分组的key,我们这里是对年龄分组。

           initial: 每组都分享一个"初始化函数",特别注意:是每一组,比如这个的age=20的value的list分享一个initial函数,age=22同样也分享一个initial函数。

           $reduce: 这个函数的第一个参数是当前的文档对象,第二个参数是上一次function操作的累计对象,第一次为initial中的{"perosn":[]}。有多少个文档, $reduce就会调用多少次。

        理解: 事实上, group函数将按照key指定的字段进行文档查询, 查询到的数据通过reduce指定的函数,放在累计对象中,该累计对象为数组(初始化对象为initial指定的数组)。 这样,通过group函数将key和查询到的数据组成一组, 达到分组的目的。

        调用示例:

            db.user.group({

    key:{age:true},

    initial:{name:[]},

    $reduce:function(cur,prev){

         prev.name.push(cur.name);

    }

    });

           

    这样我们通过age查看到了相应的name人员,不过有时我们可能有如下的要求:

         ①:想过滤掉age>25一些人员。

         ②:有时person数组里面的人员太多,我想加上一个count属性标明一下。

    针对上面的需求,在group里面还是很好办到的,因为group有这么两个可选参数: condition 和 finalize。

                 condition:  这个就是过滤条件。(类似于oracle中的having) 过滤条件和上面的find差不多, 不多说了。

                 finalize:这是个函数,每一组文档执行完后,多会触发此方法,那么在每组集合里面加上count也就是它的活了。统计计数, 爽翻。out是分组后的文档。(类似finally)

            示例:

                db.user.group({

    key:{age:true},

    initial:{person:[]},

    $reduce:function(cur,prev){

        prev.person.push(cur.name);

    },

    condition:{age:{$gt:18}},

    finalize:function(out){

        out.count = out.person.length;

    }

    });

     

        mapReduce   

            这玩意算是聚合函数中最复杂的了,不过越复杂就越灵活。

      mapReduce其实是一种编程模型,用在分布式计算中,其中有一个"map"函数,一个"reduce"函数。

       map

             这个称为映射函数,里面会调用emit(key,value),集合会按照你指定的key进行映射分组。

       reduce

             这个称为简化函数,会对map分组后的数据进行分组简化,注意:在reduce(key,value)中的key就是

          emit中的keyvlaueemit分组后的emit(value)的集合,这里也就是很多{"count":1}的数组。

       mapReduce:

             这个就是最后执行的函数了,参数为mapreduce和一些可选参数。具体看图可知:

     

    从图中我们可以看到如下信息:

           result: "存放的集合名"

           input:传入文档的个数。

           emit:此函数被调用的次数。

           reduce:此函数被调用的次数。

           output:最后返回文档的个数。

    最后我们看一下"collecton"集合里面按姓名分组的情况。

    4. 游标

        mongodb里面的游标有点类似我们说的C#里面延迟执行,比如:

                  var list=db.user.find();

    针对这样的操作,list其实并没有获取到person中的文档,而是申明一个"查询结构",等我们需要的时候通过for或者next()一次性加载过来(或者直接输入list查看list的数据),然后让游标逐行读取,当我们枚举完了之后,游标销毁,之后我们在通过list获取时,发现没有数据返回了。

       

     

    当然我们的"查询构造"还可以搞的复杂点,比如分页,排序都可以加进去。

             var single=db.person.find().sort({"name",1}).skip(2).limit(2);

    那么这样的"查询构造"可以在我们需要执行的时候执行,大大提高了不必要的花销。但是千万注意:因为游标的这种特性,有时候,编写程序的时候,list并未加载,我们就使用了它。使得程序中报空指针的错误。我就碰到过.,因此,要时刻知道list的加载时机,以免照成不必要的bug麻烦。

     

    另外, 这篇文章详细揭示了mongodb的数据使用, 可以去看看. 我也做一个记录.

           http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.html

     

    接下来,是mongodb的集群操作, 包括主备,副本集,分片等

     http://www.cnblogs.com/kevinShaw/p/5107692.html

         

     

  • 相关阅读:
    Educational Codeforces Round 67 D. Subarray Sorting
    2019 Multi-University Training Contest 5
    Educational Codeforces Round 69 (Rated for Div. 2) E. Culture Code
    Educational Codeforces Round 69 D. Yet Another Subarray Problem
    2019牛客暑期多校训练第六场
    Educational Codeforces Round 68 E. Count The Rectangles
    2019牛客多校第五场题解
    2019 Multi-University Training Contest 3
    2019 Multi-University Training Contest 2
    [模板] 三维偏序
  • 原文地址:https://www.cnblogs.com/kevinShaw/p/5112559.html
Copyright © 2011-2022 走看看