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}}
范例:删除“张三”的年龄与成绩信息


执行之后指定的成员内容就消失了。
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数据库里面,提供的修改器的支持很到位。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,932评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,554评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,894评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,442评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,347评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,899评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,325评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,980评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,196评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,163评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,085评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,826评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,389评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,501评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,753评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,171评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,616评论 2 339

推荐阅读更多精彩内容

  • 4.1、函数的基本使用 如果要修改数据最直接的使用函数就是update()函数,但是这个函数的语法要求很麻烦.语法...
    简人CC阅读 535评论 0 0
  • 只要是数据库那么就绝对离不开最为核心的功能: C U R D ,所以在Mongo 里面对于数据的操作也是有支持的,...
    Mr_米饭阅读 314评论 2 1
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,199评论 0 4
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,524评论 18 399
  • 在超市逛时,听到广播里传来小虎队的《爱》:把你的心我的心串一串,串一株幸运草,串一个同心圆,让所有期待未来的呼唤,...
    忆灰泠阅读 534评论 12 4