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类似,可以一次性追加多个内容到数组里面;