MongoDB基础操作
一、概述
在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兼容的正则表达式的形式。如果要实现正则使用,则按照如下的定义格式:
- 基础语法:{key:正则标记};
- 完整语法:{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个函数:
- 判断是否有下一行数据:hasNext();
- 取出当前数据:next();
var cursor=db.students.find();
while(cursor.hasNext()){
var doc=cursor.next();
printjson(doc);
}
本文地址:https://blog.csdn.net/daiyunxing0545/article/details/85812052
上一篇: 韩式拌饭辣酱哪个牌子好吃
下一篇: 2020-08-10