数据查询
嵌套集合运算
在mongo数据库里面每一个书记集合可以继续保存其他的集合数据。
db.students.insert({'name':'张三','gender':'男','age':19,'score':89,'address':'海淀区'})
db.students.insert({'name':'李四','gender':'女','age':20,'score':60,'address':'海淀区'})
db.students.insert({'name':'王五','gender':'男','age':18,'score':50,'address':'东城区'})
db.students.insert({'name':'赵六','gender':'女','age':21,'score':99,'address':'海淀区'})
db.students.insert({'name':'孙七','gender':'男','age':19,'score':100,'address':'西城区'})
db.students.insert({'name':'李浩','gender':'女','age':19,'score':30,'address':'海淀区'})
db.students.insert({'name':'翔神','gender':'女','age':20,'score':54,'address':'西城区'})
db.students.insert({'name':'坡坡','gender':'男','age':21,'score':76,'address':'朝阳区'})
db.students.insert({'name':'小枫','gender':'男','age':20,'score':80,'address':'东城区'})
db.students.insert({'name':'鱼哥','gender':'男','age':19,'score':75,'address':'海淀区'})
db.students.insert({'name':'谷大神 - A','gender':'男','age':19,'score':89,'address':'海淀区','course':['语文','数学','物理','化学','生物','计算机','英语'],'parents':[{'name':'人1(父亲)','age':50,'job':'工人'},{'name':'人1(母亲)','age':46,'job':'职员'}]})
db.students.insert({'name':'谷大神 - B','gender':'男','age':19,'score':89,'address':'海淀区','course':['物理','化学','生物','计算机','英语']})
db.students.insert({'name':'人3','gender':'男','age':19,'score':89,'address':'海淀区','course':['语文','数学','物理','化学','生物'],'parents':[{'name':'人2(父亲)','age':51,'job':'工人'},{'name':'人2(母亲)','age':46,'job':'局长'}]})
db.students.insert({'name':'谷大神 - C','gender':'男','age':19,'score':89,'address':'海淀区','course':['语文','数学'],'parents':[{'name':'人4(父亲)','age':49,'job':'工人'},{'name':'人4(母亲)','age':46,'job':'职员'}]})
db.students.insert({'name':'谷大神 - D','gender':'男','age':19,'score':89,'address':'海淀区','course':['语文','数学','物理','化学','生物','计算机','英语'],'parents':[{'name':'人5(父亲)','age':50,'job':'局长'},{'name':'人5(母亲)','age':46,'job':'职员'}]})
db.students.insert({'name':'谷大神 - E','gender':'男','age':19,'score':89,'address':'海淀区','course':['语文','数学','计算机','英语'],'parents':[{'name':'人6(父亲)','age':50,'job':'工人'},{'name':'人6(母亲)','age':46,'job':'职员'}]})
db.students.insert({'name':'谷大神 - F','gender':'男','age':19,'score':89,'address':'海淀区','course':['计算机','英语'],'parents':[{'name':'人7(父亲)','age':50,'job':'工人'},{'name':'人7(母亲)','age':46,'job':'局长'}]})
db.students.insert({'name':'谷大神 - G','gender':'男','age':19,'score':89,'address':'海淀区','course':['数学','物理','化学','生物','计算机','英语'],'parents':[{'name':'人8(父亲)','age':50,'job':'工人'},{'name':'人8(母亲)','age':46,'job':'职员'}]})
查出年龄大于等于19且父母中有一个职业为局长的
db.students.find({'$and':[{'age':{'$gte':19}},{'parents':{'$elemMatch':{'job':'局长'}}}]}).pretty()
判断某个字段是否存在
使用'$exists'可以判断某个字段是否存在,设置为true表示存在,false表示不存在。
db.students.find({'parents':{'$exists':true}}).pretty()
条件过滤
'$where'
db.students.find({'$where':'this.age>20'}).pretty()
db.students.find('this.age>20').pretty()
等号: ==
中文或者说文字怎么办?
正则运算
模糊查询,必须用正则表达式,而且正则表达式使用的是语言perl兼容的正则表达式的形式。
按照如下的定义格式:
- 基础语法: {key:正则标记}
- 完整语法: {key:{'$regex':正则标记,'$options':选项}}
option主要是设置正则的信息查询的标记:
'i':忽略字母大小写
'm':多行查找
'x':空白字符串除了被转义的或在字符类中以外的完全被忽略
's':匹配所有的字符(.),包括换行的内容
需要注意的是,如果是直接使用(javascript)那么只能够使用i和m,而x和s必须使用'$regex'
查询以 人 开头的姓名
db.students.find({'name':/人/}).pretty()
查询 带有 语 字的课程
db.students.find({'course':/语/i}).pretty() #i不区分大小写
数据排序
sort()
升序(1), 降序(-1)
范例:
db.students.find().sort({'score':-1}).pretty()
自然排序,就是按照创建的顺序,$natural
db.students.find().sort({'$natural':-1}).pretty()
数据分页显示
- skip(n) 表示跨过多少数据行
- limit(n) 取出的数据行的个数限制。
db.students.find().skip(0).limit(5).sort({'age':-1}).pretty()
db.students.find().skip(5).limit(5).sort({'age':-1}).pretty()
数据更新操作
save()
update()
函数的基本使用
update()
- db.集合.update(更新条件,新的对象数据,upsert,multi)
- upsert: 如果要更新的数据不存在,则增加一条新的(true为增加,false为不增加)
- multi:更新多条(true),或者只更新一条(false)
db.students.update({'age':19},{'$set':{'score':100}},false,false)
save()
db.students.save({"_id" : ObjectId("57918f4ee7b6dc04c9c56a17"),'age':50})
此时数据存在,就变成了更新。但是如果数据不存在,就变成了增加,但是对不存在的'_id'无效。我发现,更改后,就只剩下如上所示的两个属性了。
修改器
修改器小总结
- inc
- set,unset
- push, pushAll,addToSet
- pop, pull,pullAll
- rename
用法总结: {'$修改器':{'成员名':值}}
对MongoDB数据库而言,数据的修改会牵扯到内容的变更、结构的变更(包含有数组),所以在进行MongoDB设计的时候就提供有一系列的修改器的应用,那么像之前使用的“$set”就是一个修改器。
1、 $inc:主要针对于一个数字字段,增加某个数字字段的数据内容;
·语法:{"$inc" : {"成员" : 内容}}
范例:将所有年龄为19岁的学生成绩一律减少30分
2、 $set:进行内容的重新设置;
·语法:{"$set" : {"成员" : "新内容"}};
范例:将年龄是20岁的人的成绩修改为89
3、 $unset:删除某个成员的内容;
·语法:{"$unset" : {"成员" : 1}}
范例:删除“张三”的年龄与成绩信息
执行之后指定的成员内容就消失了。
4、 $push:相当于将内容追加到指定的成员之中(基本上是数组);
·语法:${"$push" : {成员 : value}}
范例:向“李四”添加课程信息(此时张三信息下没有course信息)
范例:向“谷大神 - E”里面的课程追加一个“美术”
就是进行数组数据的添加操作使用的,如果没有数组则进行一个新的数组的创建,如果有则进行内容的追加。
5、 $pushAll:与“$push”是类似的,可以一次追加多个内容到数组里面;
·语法:${"$pushAll" : {成员 : 数组内容}}
范例:向“王五”的信息里面添加多个课程内容
6、 $addToSet:向数组里面增加一个新的内容,只有这个内容不存在的时候才会增加;
·语法:{"$addToSet" : {成员 : 内容}}
范例:向王五的信息增加新的内容
此时会判断要增加的内容在数组里面是否已经存在了,如果不存在则向数组之中追加内容,如果存在了则不做任何的修改操作。
7、 $pop:删除数组内的数据;
·语法:{"$pop" : {成员 : 内容}},内容如果设置为-1表示删除第一个,如果是1表示删除最后一个;
范例:删除王五的第一个课程
范例:删除王五的最后一个课程
8、 $pull:从数组内删除一个指定内容的数据
·语法:{"$pull" : {成员 : 数据}},进行数据比对的,如果是此数据则删除;
范例:删除王五学生的音乐课程信息
9、 $pullAll:一次性删除多个内容;
·语法:{"$pull" : {成员 : [数据, 数据,...]}}
范例:删除“谷大神 - A”中的三门课程
10、 $rename:为成员名称重命名;
·语法:{"$rename" : {旧的成员名称 : 新的成员名称}};
范例:将“张三”name成员名称修改为“姓名”
在整个MongoDB数据库里面,提供的修改器的支持很到位。