目录:

  一、MongoDB 之 $ 的奇妙用法

  二、MongoDB 之 Array Object 的特殊操作

  三、MongoDB 之 limit 选取 skip 跳过 sort 排序

 

一、MongoDB 之 "$" 的奇妙用法

在MongoDB中有一个非常神奇的符号 "$"

"$"  在 update 中 加上关键字 就 变成了 修改器

其实 "$" 字符 独立出现也是有意义的 , 可以把它叫做代指符

首先看个例子: 还是这个Collection

现在把 "score": 100 的 test_list 里面的 2 改为 9

{$set :{"test_list.0" : 9}} 这样就是对应 Array 中的下标进行修改了 "test_list.下标"

问题来了 如果 是 一个很长很长很长的 Array 你要查找其中一个值,把这个值修改一下怎么整呢?

$ 字符 在语句中代表了下标,位置

解释一下: 首先我们查询一下db.Oldboy.findOne({"score":100,"test_list":3}) 返回 给我们满足条件的数据

那么 如果 我们 使用 update的话, 满足条件的数据下标位置就会传递到 $ 字符中,在我们更新操作的时候就相当于 对这个位置 的元素进行操作

 

二、MongoDB 之 Array Object 的特殊操作

相比关系型数据库, Array [1,2,3,4,5] 和 Object { 'name':'DragonFire' } 是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
    }
}

好的,这条数据已经完成了

针对这条数据我们进行一系列的操作,并讲解使用方式

1、.Array

(1).把price 中 19000 改为 19300

db.Oldboy.update({"name":"路飞学城-骑士计划"},{$set:{"price.2":19300}})

我们用了引用下标的方法更改了数值 , "price.2"代指的是 Array 中第3个元素

(2). 混合用法

如果 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 之后 再存进去

那么顺理成章的混合到一起了

现在我们混搭 $ 再做一个练习

我们把 price 小于 19500  的 自动补上 200

db.Oldboy.updateMany({"name":"路飞学城-骑士计划","price":{$lt:19500}},{$inc:{"price.$":200}})

注意 只改了第一个,是的 $ 这个只储存一个下标,批量更改的话,截至2017年1月1日,MongoDB没有这个功能

你只要把这个Array 拿出来,在程序里面改完,原封不动的放回去不就搞定了吗

2.Object 这更像是 JavaScript 中的 Object 对象

(1).把other中 count 改为 199

db.Oldboy.update({"name":"路飞学城-骑士计划"},{$set:{"other.count":199}})

对了就是在这个对象 打点儿 key 就可以更改数值了 , 要注意的是, 咱们用的 $set 进行修改的,那么就意味着,如果没有"other.count"这个field的话,他会自动创建

(2).混合用法

如果 count 小于 200 那么 加 10

3. 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日"

 

三、MongoDB 之 Limit 选取 Skip 跳过 Sort 排序

 在关系型数据库中的选取(limit),排序(sort) MongoDB中同样有,而且使用起来更简单

首先我们看下添加几条Document进来

现在有四条Document 根据它们, 对 Limit Skip Sort 分别操作 最后来一个 大杂烩

1. Limit 选取 : 我要从这些 Document 中取出多少个

做个小例子 : 我只要 2 条 Document

limit(2) 就是选取两条Document, 从整个Collection的第一条 Document 开始选取两条

2.Skip 跳过 : 我要跳过多少个Document

做个小例子 : 我要跳过前两个 Document 直接从第三个Document 开始

skip(2) 就是跳过两条Document, 从整个Collection 的第一条 Document 开始跳,往后跳两条

另一个例子 : 跳过第一条 直接从 第二条 开始

3.Limit + Skip : 从这儿到那儿 的 选取

小例子 : 我只想要第二条和第三条怎么处理呢

跳过第一条Document 从第二条开始选取两条 Document

还有另一种写法

两种写法得到的结果完全一样但是解释却不同

选取两条Document 但是要 跳过 第一条Document 从 第二条 开始 选取

注意这里的两种写法,只要记住一个就行了,完全没区别,一个符合中国人的理解,一个是其他国家的理解

4. Sort 排序 : 将结果按照关键字排序

做个小例子 : 将find出来的Document 按照 price 进行 升序 | 降序 排列

按照 price 字段进行升序 , 1 为升序 , -1 为降序

5. Limit + Skip + Sort 混搭

一个例子 : 选取第二条第三条 并 按照 price 进行 升序排列

问题出现了, 按道理不应该是 9800 然后 19800 吗?

重点 : Sort + Skip + Limit 是有执行优先级的 他们的级别分别是 优先 Sort  其次 Skip 最后 Limit

Skip + Limit 的优先级 也是先 Skip 再 Limit

 

posted on 2019-12-29 21:22  始终不够啊  阅读(206)  评论(0编辑  收藏  举报