当前位置: 移动技术网 > IT编程>开发语言>JavaScript > MongoDB基础操作

MongoDB基础操作

2020年07月30日  | 移动技术网IT编程  | 我要评论

一、概述

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

cls命令可以清屏幕

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

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

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

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

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

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

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

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

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

如:db.dept.find();

 

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

var deptData={

"deptno":20,

"dname":"研发部",

"loc":"深圳",

"count":20,

"avg":8000

};

db.dept.insert(deptData);

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();在哪个数据库下,就删除哪个,所以必须先切换到数据库后才可以操作

13,循环插入

与JavaScript完美结合

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

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

}

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

二、数据查询

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

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

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

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

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

三、关系查询

在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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网