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

  

 

posted @ 2019-07-17 23:21  Amorphous  阅读(540)  评论(0编辑  收藏  举报