一.文档的嵌套添加
现在给数据库中age:“2”
的文档对象添加一个属性,叫爱好(hobby),hobby里又分成 游戏(game),运动(sport),运动和游戏中又包括了英雄联盟,篮球之类的选项。首先这肯定牵扯的是添加这个属性,毋庸置疑选择db.grade.update
。
tips: 在终端里没有错误提示,需要特别注意一下花括号的位置和数量,你敲下{
前括号的时候,终端并不会给你补齐}
后花括号.
二.嵌套文档的查询方法
也就是说现在你只知道有个用户的爱好hobby是喜欢运动(hobby.sport:"run")
那么find方法如何去查询嵌套文档?
也许你会这样写:db.grade.find({hobby.sport:"run"})
结果是报错了此时需要注意,我们需要在hobby.sport
外加上一个引号。
三.查询的一些额外方法 (不仅仅是这些)
这些id是否太长了,我查询的时候不需要它显示出来。find()可以接收两个参数.
你没有什么特殊的查询条件的话,第一个参数设置为空对象,第二个参数设置你不想查询的属性为0.同理,如果你想看到某个属性的话,设置为1即可,默认find()第二个参数全为1。
四.嵌套文档属性的添加
现在有一个需求,我想在sport里添加一个ball。到这里,我第一步马上会想到update
然后敲下如下的命令
注意. 你能想到这里,说明你前面的方法掌握的不错,但是让我们继续研究一下这行代码。
首先set是用来修改文档属性的值的,你这样做是吧[“run”]
这个数组修改为了一个字符串"ball"
这样是会引起很大的错误。
ok分析问题,sport的属性是一个数组,快想一想,JS代码,数组,JS代码,数组?往数组里添加那不就是push
吗?是的,这时候我们只需要更换一下修饰符即可 $set
修改为$push
。结果如下。相对应的删除最后一个值是$pop
push
方法有一个弊端,它不会考虑你的数组中是否已经存在这个值,
可以看到上面sport里有两个ball,那么如何避免呢?就需要用到$addToSet
,$addToSet
和push
的区别就是会查询是否重复,如果重复则无事发生。d
让我们先简单删除一下最后一个"ball",在这里要明白,我要删除了,那么这个属性的值对我来说已经无关紧要了,直接删除对应的属性即可。删除我就只需要数组的索引就好,对于pop
来说,是数组的最后开始计数,1就是最后一个,相反-1就是索引为0的数组第一个元素。
接下来继续添加一个ball
你会看到匹配到了一个文档,但是并没有修改。这里特别提示一下即便是age的值是数字,双引号也不可以省略。
五.条件查询
2.想要查询大于100,或者
大于200的数字
需要用到$or
查询符db.number.find($or[{number:{$lt:"100"},{number:{$gt:"200"}}}])
3.仅仅只想显示所有文档的name
属性,通过给find第二个参数来限制,_id默认情况会一直显示。
4.升序或者降序sort()
这个需要用到sort方法,使用场景很多,比如价格的排序或者销量的排序。db.people.find({}).sort({salary:1})
表示按照工资升序排列
演示一下以age从小到大或者从大到小排列1表示从小到大,也就是升序,-1相反
需要注意的是,如果某些文档没有该属性,那么默认值为0,也会参与升降排序
<sort limit skip
>在代码书写时先后顺序是无所谓的,都会先sort,skip,然后limit
六.网页页数的实现原理
如果想查询数据库前10条数据,db.collection.find().limit(10)
limit是限制的意思。
如果想跳过前五条数据,那么就要执行db.collection.find().skip(5).limit()
网页页数的实现效果
这里不需要区分skip方法,和limit方法
的顺序mongoDB会自动让skip在limit之前执行