Mongodb04 - 数据操作(数组、嵌套集合、字段判断、where、正则、排序、分页显示、更新函数、修改器)

1、首先在MongoDB里面是支持数组保存的,一旦支持数组保存,需要针对数组的数据进行匹配;

  (01)、范例:保存一部分数组数据

         db.students.insert({"name":"古大神 - A", "age":15, "sex": "男", "seore": 90, "adderss": "海淀区", "course": ["语文", "数学", "英语", "音乐", "美术"]});

      db.students.insert({"name":"古大神 - B", "age":16, "sex": "男", "seore": 88, "adderss": "海淀区", "course": ["语文", "数学", "政治"]});

      db.students.insert({"name":"古大神 - C", "age":19, "sex": "女", "seore": 98, "adderss": "海淀区", "course": ["语文", "音乐", "美术"]});

      db.students.insert({"name":"古大神 - D", "age":16, "sex": "男", "seore": 80, "adderss": "朝阳区", "course": ["语文", "美术"]});

  (02)、此时的数据中包括了数组数据,而后需要针对于数组数据进行判断,可以使用几个运算符: $all、$size、$slice、$elemMatch 

  (03)、范例:查询同时参数语文和数学课程的学生  =>  {"$all": ["语文","数学"]}   =>  "$all" 筛选内容必须包含筛选条件及更多内容的项,只能多不能少;

       db.students.find({"course": {"$all": ["语文", "数学"]}}).pretty();  

       “$all”计算可以用在数组上,也可以用于一个数据的匹配上  =>   db.students.find({"adderss": {"$all": ["海淀区"]}}).pretty();  

       

  (04)、既然在集合中保存了数组信息,那么数组就可以利用索引操作:key.index的方式定义索引

       范例:查询数组信息中第二个内容(index = 1),为数学的信息   =>  db.students.find({"course.1": "数学"}).pretty(); 

       

  (05)、范例:查询出值参加两门课程的学生:使用运算符 $size 来进行数值的控制  =>  db.students.find({"course": {"$size": 2}}).pretty()

         

  (06)、控制数组返回的数量:使用$slice控制  

      范例:返回年龄为19岁所有学生的信息,但是要求只显示参加两门课  =>  db.students.find({"age": 19}, {"course": {"$slice": 2}}).pretty();  

         # 2:整数表示前两门,-2:表示后两门,[1,2]: 表示跳过第一个后面两个

        

 2、嵌套集合运算

  (01)、在MongoDB数据中每一个集合数据可以继续保存其他的集合数据。

  (02)、范例:增加信息 - 学生增加家长信息 -     

        db.students.insert({"name":"小明 - A", "age":15, "sex": "男", "seore": 90, "adderss": "海淀区",
                "course": ["语文", "数学", "英语", "音乐", "美术"],
                "parents":[{"name": "小明 - A父亲", "age": 50, "job": "工人"},
                     {"name": "小明 - A母亲", "age": 48, "job": "工人"}]});

 

       db.students.insert({"name":"小高 - B", "age":16, "sex": "男", "seore": 80, "adderss": "海淀区",
               "course": ["语文", "数学", "英语", "音乐", "美术"],
               "parents":[{"name": "小高 - B父亲", "age": 50, "job": "局长"},
                    {"name": "小高 - B母亲", "age": 48, "job": "老师"}]});

 

 

       此时给出的内容是嵌套的集合,而这种集合的数据的判断只能通过“$elemMatch”完成

      范例:查询学生父母信息是“局长”的信息  =>  db.students.find({"$and": [{"age": {"$gte": 16}},{"parents": {"$elemMatch": {"job": "局长"}}}]}).pretty();

        

        *注:如果查询条件比较麻烦,尽量别搞这么复杂的数据结构组成。 

3、判断某个字段是否存在

  (01)、使用 “ $exists ”:设置 true存在,false不存在

  (02)、范例:查询具有parents存在的数据  =>  db.students.find({"parents": {"$exists": true}}).pretty();

      

        *注:可以利用此类查询进行一些不需要的数据的过滤,强烈建议数据组成最好统一。  

4、条件过滤

  (01)、实际上习惯传统关系型数据库开发的我们对于数据的筛选,可能首先想到的是where子句,在MongoDB里面也提供有 “$where”

  (02)、范例:使用where进型数据查询   =>  db.students.find({"$where": "this.age>18"}).preety(); :this指的当前对象

       简写  =>   db.students.find({"this.age>18"}).preety();

       * 注:对于“$where”是可以简写的,但是这类的操作是属于进行每一行信息的过滤,对于数据量很大的情况并不方便,

         实际上以上的代码严格来讲属于编写一个操作的函数,可以执行JS代码。

      范例:db.students.find(function(){return this.age>18}).preety();

      以上只是查询一个,实现多个条件判断,需要使用“$and”连接

      范例:db.students.find({"$and": [{"$where": "this.age > 17"},{"$where": "this.age < 19"}]});

      

        * 注:虽然这种形式的操作可以实现数据查询,但是最大的缺点是将在MongoDB中保存的BSON数据变为了Javascript语法结构,

         这样的方式不方便使用数据库的索引机制,在整个MongoDB中索引的提升是相当明显的。(能够利用Javascript查询,但是它会把

         BSON重新变为Javascript进行循环验证,索引是不起作用的。)

5、正则运算

  (01)、如果要想实现模糊查询,必须使用正则表达式,而且正则表达式使用的是语言Perl兼容的正则表达式的形式。

      如果要想实现正则使用,则按照如下的定义格式:

  (02)、基本语法:{key: 正则标记};

  (03)、完整语法:{key: {"$regex": 正则标记,"$options": 选项}}

         $options: 主要是这只正则的信息查询的标记:

          |-  “ i ”:忽略字母大小写(用的最多)

          |-  “ m ”:多行查找;

          |-  “ x ”:空白字符串除了被转义的或在字符类中意外的完全被忽略;

          |-  “ s ”:匹配所有的字符(圆点、“ . ”),包括换行内容。

        需要注意的是,如果是直接使用(Javascsript)那么只能够使用 i 和 m ,对于 x 和 s 必须使用“$regex”。(基本上用不到)

  (04)、范例:查询名字中有 “ 谷 ” 的学生  =>  db.students.find({"name": /谷/}).pretty();

       范例:查询数据中有 A 的数  =>  db.students.find({"name": /a/i}).pretty();  #i不区分大小写

          完整格式: db.students.find({"name": {"$regex":  /a/i}}).pretty();

      *注:如果执行模糊查询的操作,严格来讲值需要编写一个关键字就够了。、

          正则操作值中除了可以查询出单个字段的内容之外,也可以进行数组数据的操作。

          MongoDB中的正则符号和之前Java正则有一些小小差别,不建议使用以前的一些标记,正则就将其应用在模糊数据查询上。

6、数据排序

  (01)、在MongoDB里面数据的排序使用 “ sort() ”,在进行排序的时候可以有两个顺序:升序(1)、降序(-1);

  (02)、范例:数据排序  =>  db.students.find().sort({"score": -1}).pretty();

  (03)、在进行排序的过程里面有一种方式称为自然排序,按照数据保存的先后顺序排列,使用:"$natural "  =>   db.students.find().sort("$natural": -1).pretty();

      在MongoDB数据库里面排序的操作相比较传统关系型数据库的设置要简单。

7、数据分页显示

  (01)、在MongoDB里面的数据分页显示也是符合于大数据要求的操作函数,

       skip(n):表示跨过多少数据行

      limit(n):取出的数据行的个数限制

  (02)、范例:分页(第一页,skip(0)、limit(5)) 

      db.students.find().skip(0).limit(5).sort({"age: -1"}).pretty();

  (03)、范例:分页(第一页,skip(5)、limit(5))

      db.students.find().skip(5).limit(5).sort({"age: -1"}).pretty();

  (04)、这两个分页的控制操作,就是在以后只要是存在有大数据的信息情况下都会使用它。

8、更新函数

  (01)、如果要修改数据最直接的使用函数就是updata()函数:语法:db.集合.updata(更新条件,新的对象数据,upsert); 

      |- upsert:如果要更新的数据不存在,则增加一条新的内容(true为增加、false为不增加

      |- multi:表示是否只更新满足条件的第一行记录,如果设置为false,只更新第一条数据,如果是true。

  (02)、范例:更新存在的数据  -- 将年龄是19岁的人成绩都更新为100分  =>  

      只更新第一条数据;第二个false决定

      db.students.update({"age": 19}, {"$set": {"score": 100}}, false, false); 

      所有满足条件的数据都更新:

      db.students.update({"age": 19}, {"$set": {"score": 100}}, false, true);

  (03)、范例:更新不存在的数据 => db.students.update({"age": 30}, {"$set": {"name": "not find"}}, true, false);

       第一个false设置为true,表示如果数据不存在就是自动增加一条数据。

  (04)、除了update()函数,还提供了一个save()函数,作用:更新不存在的内容相似。

9、数据变更

  (01)、对MongoDB数据库而言,内容的变更、结构的变更(包含有数组),所以在进行MongoDB设计的时候,提供了一系列的修改器功能,“$set”就是有一个。

  (02)、$inc:  主要针对于一个数字字段,增加某个数字字段的数据内容;  语法 : {"$inc": { "成员" : 内容 }}

      范例:将所有19岁的学生成绩减30,年龄加1  =>  db.students.update({"age": 19}, {"$inc": {"score": -30, "age": 1}}, false, true);

  (03)、$set:数据重新设置

      范例:重新设置20岁学生成绩为89   =>  db.students.update({"age": 20}, {"$set": {"score": 89}});

  (04)、$unset:删除某个成员的内容   =>   语法:{"$unset": {成员:1}}

      范例:删除“张三”的年龄与成绩信息   =>  db.students.update({"name":"张三"}, {"$unset": {"age": 1, "score":1}});

      执行之后指定的成员内容就会删除;

  (05)、$push:将内容追加到指定的成员之中(基本上是数组) =>   语法:{"$push": {成员:value}}

      范例:“李四”添加课程信息(此时李四信息下没有course信息) =>  db.students.update({"name":"李四"}, {"$push": {"course": "语文"}});

      *注:进行数据添加的时候,如果没有数组则新建一个数组;

  (06)、$pushAll: 与$push类似,可以一次性追加多个内容到数组里面;语法:{"$pushAll": {成员:数组成员}}

  (07)、$addToSet: 想在数组里面增加一个新的内容,只有这个内容不存在才能添加;语法:{"$addToSet": {成员:内容}}

  (08)、$pop:删除数组内的数据;语法: {"$pop": {成员:内容}} => 内容如果设置为-1删除第一个,1删除最后一个

      范例:删除王五的第一个课程 => db.students.update({"name":"王五"}, {"$pop": {"course": -1}});

  (09)、$pull:从数组内删除一个指定内容的数据;语法:{"$pull": {成员:数据}} => 进行数据比对,如果是此数据则删除
      范例:db.students.update({"name":"王五"}, {"$pull": {"course": "语文"}});

  (10)、$pullAll:从数组内删除一个指定内容的数据;语法:{"$pullAll": {成员:["语文","数学","英语"] }}

      范例:删除“王五”中的三门课程  =>   db.students.update({"name":"王五"}, {"$pullAll": {"course": ["语文"."数学","英语"]}});

  (11)、$rename:为成员名称重命名;语法:{"$rename": {旧的成员名称:新的成员名称}}

      范例:将“张三”name成员名称修改为“姓名”:db.students.update({"name":"张三"}, {"$rename": {"name": "姓名"}});

      *注:在整个MongoDB数据库里面,提供的修改器的支持很到位。

posted @ 2017-12-27 18:51  FallenLunatic  阅读(455)  评论(0编辑  收藏  举报