MongoDB 之 Array Object 的特殊操作与排序(sort) 选取(limit) 跳过(skip)
一、Array 和 Object 类型的普通用法
相比关系型数据库, Array [1,2,3,4,5] 和 Object { 'name':'annie' } 是MongoDB 比较特殊的类型了
特殊在哪里呢?在他们的操作上又有什么需要注意的呢?
那我们先建立一条数据,包含 Array 和 Object 类型
db.Oldboy.insert({"name":"路飞学城-骑士计划","price":[19800,19500,19000,18800],"other":{"start":"2018年8月1日","start_time":"08:30","count":150}})
{ "_id" : ObjectId("5b17d01a49bf137b585df891"), "name" : "路飞学城-骑士计划", "price" : [ 19800, 19500, 19000, 18800 ], "other" : { "start" : "2018年8月1日", "start_time" : "08:30", "count" : 150 } }
把price 中 19000 改为 19300
db.Oldboy.update({"name":"路飞学城-骑士计划"},{$set:{"price.2":19300}})
我们用了引用下标的方法更改了数值 , "price.2"代指的是 Array 中第3个元素
二、Array 和 Object 类型的混合用法
1、 如果 price.1 中小于19800 则加 200
db.Oldboy.update({"name":"路飞学城-骑士计划","price.1":{$lt:19800}},{$inc:{"price.1":200}})
"price.1":{$lt:19800} 是查找 price.1 小于 19800
{$inc:{"price.1":200}} 是什么啊? price.1 拿出来 加上 200 之后 再存进去
那么顺理成章的混合到一起了
2、我们把 price 小于 19500 的 自动补上 200
db.Oldboy.updateMany({"name":"路飞学城-骑士计划","price":{$lt:19500}},{$inc:{"price.$":200}})
测试发现了,只改了第一个,是的 $ 这个只储存一个下标,批量更改的话,MongoDB没有这个功能
你只要把这个Array 拿出来,在程序里面改完,原方不动的放回去不就搞定了吗
三、JavaScript 中的 Object 对象的用法
1、把other中 count 改为 199
db.Oldboy.update({"name":"路飞学城-骑士计划"},{$set:{"other.count":199}})
对了就是在这个对象 打点儿 key 就可以更改数值了 , 要注意的是, 咱们用的 $set 进行修改的,那么就意味着,如果没有"other.count"这个field的话,他会自动创建
2、混合用法
如果 count 小于 200 那么 加 10
Object的用法:通过.方法调用
四、 Array + Object 的混合用法
首先,我们要先建立一条 Document
{ "_id" : ObjectId("5b17de9d44280738145722b9"), "name" : "路飞学城-骑士计划", "price" : [ { "start" : "2018年8月1日", "start_time" : "08:30", "count" : 150 }, { "start" : "2018年8月2日", "start_time" : "09:30", "count" : 160 }, { "start" : "2018年8月3日", "start_time" : "10:30", "count" : 170 }, { "start" : "2018年8月4日", "start_time" : "11:30", "count" : 180 } ] }
insert的代码要自己写哦,学完一直没怎么练习过,Document添加完成之后
1、把count 大于 175 的field 加 15
db.Oldboy.update({"price.count":{$gt:175}},{$inc:{"price.$.count":15}})
分析一下我们的代码:
{"price.count":{$gt:175}}, price 明明是个 Array 啊 怎么就直接 打点儿 count 了呢 这里要知道price 打点儿 就是从内部的Object 中找到 count 小于 175 的结果
{$inc:{"price.$.count":15}} , 这里就比较好理解了,price里面第 $ (大于175的第一个) 个元素中 count 增加 15
2、把 count 大于 180 的 start 改为 "2018年8月10日"
五、Limit 选取操作
首先我们看下添加几条Document进来
1. Limit 选取 : 我要从这些 Document 中取出多少个
做个小例子 : 我只要 2 条 Document
要解释一下 : limit(2) 就是选取两条Document, 从整个Collection的第一条 Document 开始选取两条
六、Skip 跳过操作
1.Skip 跳过 : 我要跳过多少个Document
做个小例子 : 我要跳过前两个 Document 直接从第三个Document 开始
解释一下 : skip(2) 就是跳过两条Document, 从整个Collection 的第一条 Document 开始跳,往后跳两条
2.另一个例子 : 跳过第一条 直接从 第二条 开始
问题来了,我只想要第二条和第三条怎么处理呢?
3.Limit + Skip : 从这儿到那儿 的 选取
一个小例子 : 我只想要第二条和第三条怎么处理呢?
答案:跳过第一条Document 从第二条开始选取两条 Document
别着急,还有另一种写法
解释:选取两条Document 但是要 跳过 第一条Document 从 第二条 开始 选取,默认会先执行skip操作
七、Sort 排序操作
1. Sort 排序 : 将结果按照关键字排序
做个小例子 : 将find出来的Document 按照 price 进行 升序 | 降序 排列
解释:按照 price 字段进行升序 , 1 为升序 , -1 为降序
2. Limit + Skip + Sort 混合用法
一个例子 : 选取第二条第三条 并 按照 price 进行 升序排列
重点注意 : Sort + Skip + Limit 是有执行优先级的 他们的界别分别是 优先 Sort 其次 Skip 最后 Limt
Skip + Limit 的优先级 也是先 Skip 再 Limit