欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MongoDB基础操作

程序员文章站 2022-03-03 20:09:07
一、概述在MongoDB数据库里是存在有数据库的概念,但是没有模式(所有的信息都是按照文档保存的),保存数据的结构就是JSON结构,只不过在进行一些数据处理的时候,才会使用MongoDB自己的一些操作符号。cls命令可以清屏幕1,使用mldn数据库,命令:use mldn;实际上这个时候并不会创建数据库,只有在数据库里保存集合后才真正创建数据库2,创建一个集合--创建一个emp......

一、概述

在MongoDB数据库里是存在有数据库的概念,但是没有模式(所有的信息都是按照文档保存的),保存数据的结构就是JSON结构,只不过在进行一些数据处理的时候,才会使用MongoDB自己的一些操作符号。

cls命令可以清屏幕

1,使用mldn数据库,命令:use mldn;

实际上这个时候并不会创建数据库,只有在数据库里保存集合后才真正创建数据库

2,创建一个集合--创建一个emp集合,命令:db.creatCollection("emp");

这个时候mldn数据库才会真正的存在。

MongoDB基础操作

3,但是很多时候如果按照以上的代码形式进行会觉得不正常,因为正常人使用MongoDB数据库集合操作的时候,都是直接向里面保存一个数据。

这时候查找emp数据集是没数据的,命令:db.emp.find();

MongoDB基础操作

写入数据命令:db.dept.insert({"deptno":10,"dname":"财务部","loc":"北京"});

MongoDB基础操作

4,查看所有集合命令:show collections; 发现dept的集合自动创建

MongoDB基础操作

5,查看表的数据命令:db.集合名称.find({若干条件});

如:db.dept.find();

MongoDB基础操作

 

6,插入不同JSON结构的数据

var deptData={

"deptno":20,

"dname":"研发部",

"loc":"深圳",

"count":20,

"avg":8000

};

db.dept.insert(deptData);

MongoDB基础操作

dept集合的内容可以由用户*定义,在MongoDB里没有查看集合结构的命令。

7,关于ID的问题

在MongoDB集合中的每一行记录都会自动的生成一个"_id",数据的组成是:时间戳+机器码+进程的PID+计数器,这个ID的信息是MongoDB绝对不可能被改变

8,查看 单独的一个文档信息

db.dept.findOne();

9,删除数据(按照JSON格式)

db.dept.remove({"_id" : ObjectId("5c3072631d35bde18744c808")});

10,更新数据

var deptData={

"deptno":50,

"dname":"乞讨部",

"loc":"家里蹲"

};

db.dept.update({"_id" : ObjectId("5c3074751d35bde18744c809")},deptData);

11,删除集合

语法:db.dept.drop();

12,删除数据库

语法:db.dropDatabase();在哪个数据库下,就删除哪个,所以必须先切换到数据库后才可以操作

MongoDB基础操作

13,循环插入

与JavaScript完美结合

for(var x=0;x<1000;x++){

db.infos.insert({"url":"mldn-"+x});

}

MongoDB基础操作

 it可以查看更多,MongoDB不会显示所有数据,传统的会都列出

二、数据查询

在MongoDB数据查询有关系运算、逻辑运算、数组运算、正则运算等等。

最简单用法:db.infos.find();

希望找出mldn-19的数据:db.infos.find({"url":"mldn-19"});

MongoDB基础操作

不想显示_id :db.infos.find({"url":"mldn-19"},{"_id":0});

MongoDB基础操作

漂亮的显示(格式化输出,多行才可以看出效果):db.infos.find({"url":"mldn-19"},{"_id":0}).pretty();

MongoDB基础操作

三、关系查询

在MongoDB里面支持的关系查询:大于($gt)、小于($lt)、大于等于($gte)、小于等于($lte)、不等于($ne)、等于($eq)。

定义一个测试记录集合

db.students.drop();

db.students.insert({"name":"张三","sex":"男","age":19,"score":89,"address":"海淀区"});

db.students.insert({"name":"李四","sex":"男","age":18,"score":75,"address":"朝阳区"});

db.students.insert({"name":"王五","sex":"女","age":113,"score":62,"address":"西城区"});

范例:查找张三的学生信息

db.students.find({"name":"张三"}).pretty();

范例:查询性别是男的学生信息

db.students.find({"sex":"男"}).pretty();

范例:查询年龄大于18的学生

db.students.find({"age":{"$gt":18}}).pretty();

此时与之前最大的区别在于,在一个JSON结构里面需要定义其它的JSON结构。

四、逻辑运算

逻辑运算主要就是三种类型:与($and)、或($or)、非($not\$nor)

范例:查询年龄在18到20的学生信息

db.students.find({"age":{"$gte":18,"$lte":20}}).pretty();

逻辑运算and的连接是最简单的,只需要“,”隔开。

范例:查询年龄大于20,或者成绩大于85的学生

db.students.find({"$or":[{"age":{"$gt":20}},{"score":{"$gt":85}}]}).pretty();

范例:nor进行或的求反操作

db.students.find({"$nor":[{"age":{"$gt":20}},{"score":{"$gt":85}}]}).pretty(); 得到(查询年龄大于20,或者成绩大于85的学生)剩下的那部分

五、求模

模的运算使用"$mod",语法"{"$mod":[除数,余数]}"

db.students.find({"age":{"$mod":[18,0]}}).pretty();

表示除数是18,余数是0的数据信息

六、范围查询

"$in"(在范围之中),"$nin"(不在范围之中)

范例:查询姓名是”张三“,“李四”的信息

db.students.find({"name":{"$in":["张三","李四"]}}).pretty();

范例:查询姓名不是”张三“,“李四”的信息

db.students.find({"name":{"$nin":["张三","李四"]}}).pretty();。

七、数组查询

MongoDB支持数组保存

范例:保存数组内容

db.students.insert({"name":"小李-A","sex":"男","age":18,"score":89,"address":"海淀区","course":["语文","数学","英语","音乐","政治"]});

db.students.insert({"name":"小李-B","sex":"男","age":18,"score":89,"address":"海淀区","course":["语文","数学"]});

db.students.insert({"name":"小李-C","sex":"男","age":19,"score":89,"address":"海淀区","course":["语文","数学","英语"]});

db.students.insert({"name":"小李-D","sex":"男","age":19,"score":89,"address":"海淀区","course":["英语","音乐","政治"]});

db.students.insert({"name":"小李-E","sex":"男","age":20,"score":89,"address":"海淀区","course":["语文","政治"]});

此时的数据包含数组,根据数组进行判断,可以使用几个运算符:$all、 $size、 $slice、 $elemMatch

范例:查询同时参加语文和数学课程的学生

使用“{"$all",[内容1,内容2,...]}”

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

范例:查询学生地址是”海淀区“的单独信息

db.students.find({"address":{"$all":["海淀区"]}}).pretty();

范例:查询数组中第二个内容(index=1,索引下标从0开始)为音乐信息的内容

db.students.find({"course.1":"音乐"}).pretty();

范例:要求查询出只参加两门课程的学生

使用“$size”来进行数量的控制

db.students.find({"course":{"$size":2}}).pretty();

 

发现只要是内容符合条件,数组的内容就全部返回了,现在要控制返回的数量,可以用“$slice”进行控制

范例:返回年龄为19岁所有学生的信息,但是要求只显示2门参加的课程(只取出前2门)

db.students.find({"age":19},{"course":{"$slice":2}}).pretty();

范例:返回年龄为19岁所有学生的信息,但是要求只显示2门参加的课程(只取出后2门)

db.students.find({"age":19},{"course":{"$slice":-2}}).pretty();

范例:返回年龄为19岁所有学生的信息,但是要求只显示只取中间部分

db.students.find({"age":19},{"course":{"$slice":[1,2]}}).pretty();

第一个数据表示跳过的数量,而第二个数据表示返回的数量

八、嵌套查询

插入数据

db.students.insert({"name":"小刘-A","sex":"男","age":18,"score":89,"address":"海淀区",

"course":["语文","数学","英语","音乐","政治"],

"parents":[{"name":"小刘-A(父亲)","age":50,"job":"工人"},

                {"name":"小刘-A(母亲)","age":46,"job":"职员"}]});

db.students.insert({"name":"小刘-B","sex":"男","age":18,"score":89,"address":"海淀区",

"course":["语文","数学"],

"parents":[{"name":"小刘-B(父亲)","age":52,"job":"处长"},

                {"name":"小刘-B(母亲)","age":48,"job":"局长"}]});

db.students.insert({"name":"小刘-C","sex":"男","age":19,"score":89,"address":"海淀区",

"course":["语文","数学","英语"],

"parents":[{"name":"小刘-C(父亲)","age":52,"job":"工人"},

                {"name":"小刘-C(母亲)","age":48,"job":"局长"}]});

范例:查出年龄大于19且父母有人是局长的信息

db.students.find(

{

"$and":[{"age":{"$gte":19}},

              {"parents":{"$elemMatch":{"job":"局长"}}}]

}).pretty();

由于这种查询的时候条件比较麻烦,如果可能,数据结构尽量搞简单的

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

使用“$exists”可以判断某个字段是否存在,如果设置为true表示存在,false表示不存在

范例:查询具有parents成员的数据

db.students.find({"parents":{"$exists":true}}).pretty();

范例:查询不具有course成员的数据

db.students.find({"course":{"$exists":false}}).pretty();

可以利用此类查询来进行一些不需要的数据的过滤。

但是强烈建议数据结构一致

十、条件过滤

在MongoDB里面也提供了“$where"。

范例:使用where查询进行数据查询

db.students.find({"$where":"this.age>20"}).pretty();//this表示JavaScript循环判断每个对象

等价于

db.students.find({"this.age>20"}).pretty();

对于”$where“是可以简化的,但是这类的操作是属于进行每一行的信息判断,实际上对于数据量较大的情况并不方便使用。实际上以上的代码严格来讲是属于编写一个操作的函数。

如:

 db.students.find(function(){

return this.age>18;

}).pretty();

 

范例:多个条件查询

db.students.find({"$and":[

{"$where":"this.age>18"},

{"$where":"this.age<20"}]}).pretty();

虽然这种形式的操作可以实现数据查询,但是最大的缺点是将MongoDB里面保存的BSON数据重新变为了JavaScript的语法结构,这样的方式不方便使用数据库的索引机制。不建议使用

面试点:说一下where的使用限制

回答:它能够用JavaScript查询,但是把BSON重新变为JavaScript进行循环验证,我们的索引是不能起作用的。

十一、正则运算(模糊查询)

Oracle的正则很少关注,但是MongoDB的正则必须关注,如果要实现模糊查询,那么必须使用正则表达式,而且正则表达式使用的语言Perl兼容的正则表达式的形式。如果要实现正则使用,则按照如下的定义格式:

  1. 基础语法:{key:正则标记};
  2. 完整语法:{key:{"$regex":正则标记 ,"$options":选项}}

      options主要设置正则的信息查询的标记:

      "i":忽略字母大小写;

      "m":多行查找

       "x":空白字符串除了被转义的或在字符类中以为的完全被忽略

       "s":匹配所有的字符(圆点、"."),包括换行内容

需要注意的是,如果是直接使用(JavaScript)那么只能够使用i和m,而“x”和“s”必须使用“$regex"。

范例:查询包含刘的姓名

db.students.find({"name":/刘/}).pretty();

 

范例:查询含有字母A的姓名,并且不区分大小写

db.students.find({"name":/A/i}).pretty();

等价于完整格式的:

db.students.find({"name":{"$regex":/A/i}}).pretty();

范例:查询数组数据

db.students.find({"course":/语/}).pretty();

 

十二、数据排序

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

范例:数据排序

db.students.find().sort({"score":-1}).pretty();

范例:自然排序

自然排序:按照数据保存的先后顺序排序,使用“$natural”表示。

db.students.find().sort({"$natural":-1}).pretty();

十三、数据分页显示

在MongoDB里面的数据分页显示也是符合大数据要求的操作函数:

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

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

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

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

范例:分页显示(第二页,skip(5)、limit(5))

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

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

十四、数据更新操作

对于MongoDB而言,数据的更新基本上是一件很麻烦的事情,如果真的需要变更,那么最好的办法是删除掉重新插入。

在MongoDB里面对于数据的更新操作提供了2类函数:save()、update()

1,update()

语法:db.集合 .update(更新条件,新的对象数据(更新操作符),upsert,multi);

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

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

范例:更新存在的数据,将年龄是18岁的人成绩更新为100分(此时会返回多条数据)

只更新第一条数据:

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

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

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

范例:更新不存在的数据

db.students.update({"age":30},{"$set":{"name":"不存在"}},true,false);

 

除了update()函数之外,还有save(),但是不好用

十五、修改器

总共有10种修改器

1,$inc:注意针对一个数字字段,增加某个数字字段的数据内容

语法:{"$inc":{"成员":内容}}

范例:将所有年龄为19岁的成绩都减少20分,年龄加2岁

db.students.update({"age":19},{"$inc":{"score":-20,"age":2}});//只操作一个数据

db.students.update({"age":19},{"$inc":{"score":-20,"age":2}},false,true);//所有符合的都更新

2,$set:进行内容的重新设置

语法:{"$set":{"成员":"新内容"}}

范例:将年龄是20岁的人的成绩修改为90

db.students.update({"age":20},{"$set":{"score":90}});

3,$unset:删除某个成员的内容(相当于修改表结构)

语法:{"$unset":{"成员":1}}

范例:删除张三的年龄与成绩信息

db.students.update({"name":"张三"},{"$unset":{"age":1,"score":1}});

执行后就相当于修改了表结构

4,$push:相当于将内容追加到指定的成员之中(基本上是数组)

语法:{"$push":{成员:value}}

如果没有该数组,则进行创建,如果有则进行内容的追加,只能加一个内容

范例:向张三添加课程信息

db.students.update({"name":"张三"},{"$push":{"course":"数学"}});

5,$pushAll:与$push是类似的,一次可以追加多个内容

语法:{"$pushAll":{成员:数组内容}}

范例:向张三添加多个课程内容

db.students.update({"name":"张三"},{"$pushAll":{"course":["美术","音乐","体育"]}});

6,$addToSet:向数组里面增加一个新的内容,只有这个内容不存在的时候才会增加

语法:{"$addToSet":{成员:内容}}

会判断要增加的内容在数组是否已经存在

范例:向张三的课程新增内容

db.students.update({"name":"张三"},{"$addToSet":{"course":"舞蹈"}});

7,$pop:删除数组内的数据

语法:{"$pop":{成员:内容}},内容如果设置为-1表示删除第一个

范例:删除张三的第一个课程

db.students.update({"name":"张三"},{"$pop":{"course":-1}});

范例:删除张三的最后一个课程

db.students.update({"name":"张三"},{"$pop":{"course":1}});

8,$pull:从数组内删除一个指定内容的数据

语法:{"$pull":{成员:数据}},进行数据比对,如果是此数据则删除

范例:删除张三的音乐课程

db.students.update({"name":"张三"},{"$pull":{"course":"音乐"}});

9,$pullAll:一次性删除多个内容

语法:{"$pull":{成员:[数据1,数据2,...]}}

范例:删除张三的2门课程

db.students.update({"name":"张三"},{"$pullAll":{"course":["数学","美术"]}});

10,$rename:为成员名称重命名

语法:{"$rename":{旧的成员名称:新的成员名称}};

范例:将张三的”name“改为“xingming”

db.students.update({"name":"张三"},{"$rename":{"name":"xingming"}});

 

MongoDB保存数据的时候最好不要用内嵌文档和数组,保存基本数据比较方便。它只是个附加的数据库作为查询使用,尽可能简单。

十六、删除数据

 使用remove()即可删除数据

范例:清空集合中的内容

db.students.remove({});

范例:删除姓名带有小的,默认下会全部删除

db.students.remove({"name":/小/});

范例:删除姓名带有刘的,但是只删除一个

db.students.remove({"name":/刘/},true);

十七、游标(重要)

游标就是数据可以一行行的进行操作,非常类似于ResultSet数据处理。在MongoDB数据库里对于游标的控制比较简单,只需要使用find()函数就可以使用游标。对于返回的游标如果想要进行操作,使用2个函数:

  1. 判断是否有下一行数据:hasNext();
  2. 取出当前数据:next();

var cursor=db.students.find();

while(cursor.hasNext()){

    var doc=cursor.next();

    printjson(doc);

}

本文地址:https://blog.csdn.net/daiyunxing0545/article/details/85812052

相关标签: MongoDB