MongoDB学习笔记第二章2_20160722

数据查询

嵌套集合运算

在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'无效。我发现,更改后,就只剩下如上所示的两个属性了。

修改器

修改器小总结

  1. inc
  2. set,unset
  3. push, pushAll,addToSet
  4. pop, pull,pullAll
  5. rename
    用法总结: {'$修改器':{'成员名':值}}

对MongoDB数据库而言,数据的修改会牵扯到内容的变更、结构的变更(包含有数组),所以在进行MongoDB设计的时候就提供有一系列的修改器的应用,那么像之前使用的“$set”就是一个修改器。
1、 $inc:主要针对于一个数字字段,增加某个数字字段的数据内容;
·语法:{"$inc" : {"成员" : 内容}}

范例:将所有年龄为19岁的学生成绩一律减少30分


2、 $set:进行内容的重新设置;
·语法:{"$set" : {"成员" : "新内容"}};
范例:将年龄是20岁的人的成绩修改为89


3、 $unset:删除某个成员的内容;
·语法:{"$unset" : {"成员" : 1}}
范例:删除“张三”的年龄与成绩信息

MongoDB学习笔记第二章2_20160722_第1张图片

执行之后指定的成员内容就消失了。
4、 $push:相当于将内容追加到指定的成员之中(基本上是数组);
·语法:${"$push" : {成员 : value}}
范例:向“李四”添加课程信息(此时张三信息下没有course信息)


范例:向“谷大神 - E”里面的课程追加一个“美术”

MongoDB学习笔记第二章2_20160722_第2张图片

就是进行数组数据的添加操作使用的,如果没有数组则进行一个新的数组的创建,如果有则进行内容的追加。
5、 $pushAll:与“$push”是类似的,可以一次追加多个内容到数组里面;
·语法:${"$pushAll" : {成员 : 数组内容}}
范例:向“王五”的信息里面添加多个课程内容

MongoDB学习笔记第二章2_20160722_第3张图片

6、 $addToSet:向数组里面增加一个新的内容,只有这个内容不存在的时候才会增加;
·语法:{"$addToSet" : {成员 : 内容}}
范例:向王五的信息增加新的内容


此时会判断要增加的内容在数组里面是否已经存在了,如果不存在则向数组之中追加内容,如果存在了则不做任何的修改操作。
7、 $pop:删除数组内的数据;
·语法:{"$pop" : {成员 : 内容}},内容如果设置为-1表示删除第一个,如果是1表示删除最后一个;
范例:删除王五的第一个课程


范例:删除王五的最后一个课程


8、 $pull:从数组内删除一个指定内容的数据
·语法:{"$pull" : {成员 : 数据}},进行数据比对的,如果是此数据则删除;
范例:删除王五学生的音乐课程信息


9、 $pullAll:一次性删除多个内容;
·语法:{"$pull" : {成员 : [数据, 数据,...]}}
范例:删除“谷大神 - A”中的三门课程

MongoDB学习笔记第二章2_20160722_第4张图片

10、 $rename:为成员名称重命名;
·语法:{"$rename" : {旧的成员名称 : 新的成员名称}};
范例:将“张三”name成员名称修改为“姓名”


在整个MongoDB数据库里面,提供的修改器的支持很到位。

你可能感兴趣的:(MongoDB学习笔记第二章2_20160722)