zoukankan      html  css  js  c++  java
  • MongoDB二 之数据类型

    一.MongoDB 之 数据类型世界

    首先我们要先了解一下MongoDB中有什么样的数据类型:

    Object  ID :Documents 自生成的 _id

    String: 字符串,必须是utf-8

    Boolean:布尔值,true 或者false (这里有坑哦~在我们大Python中 True False 首字母大写)

    Integer:整数 (Int32 Int64 你们就知道有个Int就行了,一般我们用Int32)

    Double:浮点数 (没有float类型,所有小数都是Double)

    Arrays:数组或者列表,多个值存储到一个键 (list哦,大Python中的List哦)

    Object:如果你学过Python的话,那么这个概念特别好理解,就是Python中的字典,这个数据类型就是字典

    Null:空数据类型 , 一个特殊的概念,None Null

    Timestamp:时间戳

    Date:存储当前日期或时间unix时间格式 (我们一般不用这个Date类型,时间戳可以秒杀一切时间类型)

    看着挺多的,但是真要是用的话,没那么复杂,很简单的哦

    二.MongoDB 之 剖析MongoDB的数据类型

    那么我们根据以上所说的数据类型(捡重点说,别整没用的)展开说明:

    1.Object ID :

    复制代码
    "_id" : ObjectId("5b151f8536409809ab2e6b26")

    #"5b151f85" 代指的是时间戳,这条数据的产生时间
    #"364098" 代指某台机器的机器码,存储这条数据时的机器编号
    #"09ab" 代指进程ID,多进程存储数据的时候,非常有用的
    #"2e6b26" 代指计数器,这里要注意的是,计数器的数字可能会出现重复,不是唯一的
    #以上四种标识符拼凑成世界上唯一的ObjectID
    #只要是支持MongoDB的语言,都会有一个或多个方法,对ObjectID进行转换
    #可以得到以上四种信息

    #注意:这个类型是不可以被JSON序列化的
    复制代码

    这是MongoDB生成的类似关系型DB表主键的唯一key,具体由24个字节组成:

    0-8字节是时间戳,

    9-14字节的机器标识符,表示MongoDB实例所在机器的不同;

    15-18字节的进程id,表示相同机器的不同MongoDB进程。

    19-24字节是计数器

    2.String :

    UTF-8字符串,记住是UTF-8字符串

    3.Boolean :

    true or false 这里首字母是小写的

    4.Integer :

    整数 (Int32 Int64 你们就知道有个Int就行了,一般我们用Int32)

    5.Double :

    浮点数 (MongoDB中没有float类型,所有小数都是Double)

    6.Arrays :

    复制代码
    {
        "_id" : ObjectId("5b163830993ddc4cd4918ead"),
        "name" : "LuffyCity",
        "teacher" : [
            "DragonFire",
            "WuSir2B",
            "Alex AGod"
        ]
    }
    复制代码

    数组或者列表,多个值存储到一个键 (list哦,大Python中的List哦

    7.Object :

    复制代码
    {
        "_id" : ObjectId("5b163915993ddc4cd4918eaf"),
        "name" : "LuffyCity",
        "course" : {
            "name" : "Python",
            "price" : 19800
        }
    }
    复制代码

    如果你学过Python的话,那么这个概念特别好理解,就是Python中的字典,这个数据类型就是字典

    8.Null :

    {
        "_id" : ObjectId("5b163a0e993ddc4cd4918eb0"),
        "name" : "LuffyCity",
        "course" : null
    }

    空数据类型 , 一个特殊的概念,None Null

    9.Timestamp :时间戳

    {
        "_id" : ObjectId("5b163bbf993ddc4cd4918eb3"),
        "name" : "LuffyCity",
        "date" : 1528183743111
    }

    10.Date :

     

    {
        "_id" : ObjectId("5b163ba1993ddc4cd4918eb2"),
        "name" : "LuffyCity",
        "date" : ISODate("2018-06-05T15:28:33.705+08:00")
    }

     存储当前日期或时间格式 (我们一般很少使用这个Date类型,因为时间戳可以秒杀一切时间类型)

     三. MongoDB 之 $关键字 及 $修改器

    MongoDB中类似$set这样的关键字有很多, $lt $gt $lte $gte 等等,这么多我们也不方便记,这里我们说说几个比较常见的

    一. 查询中常见的 $lt  $gt  $lte  $gte 

    等于 : 在MongoDB中什么字段等于什么值其实就是 " : " 来搞定 比如 "name" : "路飞学城"

    大于 : 在MongoDB中的 大于 > 号 我们用 : $gt  比如 :  "score" : { $gt : 80 } 就是 得到 "score" 大于 80 的数据

    小于 : 在MongoDB中的 小于 < 号 我们用 : $lt  比如 :  "score" : { $lt : 80 } 就是 得到 "score" 小于 80 的数据

    大于等于 : 在MongoDB中的 大于等于 >= 号 我们用 : $gte  比如 :  "score" : { $gte : 80 } 就是 得到 "score" 大于等于 80 的数据

    小于等于 : 在MongoDB中的 小于等于 <= 号 我们用 : $lte  比如 :  "score" : { $lte : 80 } 就是 得到 "score" 小于等于 80 的数据

    这就是MongoDB中的运算符,是不是很类似我们使用的ORM中的运算符啊,没错,最开始的时候我们就已经说了,MongoDB的操作就是很类似ORM的

    二.MongoDB之update修改器

    在此前的update中,我们用过$set,对数据进行过更新,其实在update中还存在很多的$关键字,我们把update中的这些关键字叫做 修改器

    修改器很多,这里挑一些重要的来说一说:

    1.$inc : Python中的  变量 += 1 , 将查询到的结果 加上某一个值 然后保存

    还是刚才Collection数据,我们来试一下$inc , 让不及格的 "路飞学城2" 变成 60 分

    成功了 , {$inc:{"score":1}}的意思是,"score"的原有数值上面 +1,那我们再来实验一次,把60改为20,这怎么操作呢,其实可以理解为在 60 上加一个 -40

    又成功了 , {$inc:{"score":-20}}

    $inc 的用法就是原有基础上在增加多少

    2.$set : 此前我们已经提到过 $set 的用法和特性(没有就自动添加一条)了

    再做一个例子:把 "score" 为 100 分 的 "english_name" 赋值为 "LuffyCity"

    再把 "score" 为 20 分的 "score" 赋值为 59 分

    3.$unset : 用来删除Key(field)的

    做一个小例子 : 刚才我们有一个新的"english_name" 这个field ,现在我们来删除它

     {$unset:{"english_name" : 1}} 就是删除 "english_name" 这个 field 相当于 关系型数据库中删除了 字段

    4. $push : 它是用来对Array (list)数据类型进行 增加 新元素的,相当于我们大Python中 list.append() 方法

    做一个小例子 :首先我们要先对原有数据增加一个Array类型的field:

    使用update $set 的方法只能为Document中的第一条添加

    使用updateMany $set 的方法 可以为所有满足条件的 Document 添加 "test_list" , 注意我这里的条件为空 " {} " 就算是为空,也要写上"{}" 

    要对列表进行添加了: 将 "score" 为 100 的Document 中"test_list" 添加一个 6

    $push 是在 Array(list) 的尾端加入一个新的元素  {$push : {"test_list" : 6}}

    5.$pull : 有了$push 对Array类型进行增加,就一定有办法对其内部进行删减,$pull 就是指定删除Array中的某一个元素

    做一个例子: 把我们刚才$push进去的 6 删除掉

    问题来了,如果 Array 数据类型中 如果有 多个 6 怎么办呢?

    全部删掉了.....

    得出了一个结论,只要满足条件,就会将Array中所有满足条件的数据全部清除掉

    6. $pop : 指定删除Array中的第一个 或 最后一个 元素

    做个小例子: 删除"score" 等于 100 分  test_list 的最后一个元素

    怎么删除第一个呢?

    {$pop:{"test_list" : -1}}  -1 代表最前面, 1 代表最后边 

    三. 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的话, 满足条件的数据下标位置就会传递到 $ 字符中,在我们更新操作的时候就相当于 对这个位置 的元素进行操作

  • 相关阅读:
    [公告] 置顶博客一览
    [公告] 关于花
    【题解】[SNOI2019] 纸牌
    [题解向] PAM简单习题
    [题解向] 带悔贪心泛做
    [题解向] Manacher简单习题
    java记录(2)
    java记录(1)
    js垃圾回收的机制
    盒子的计算
  • 原文地址:https://www.cnblogs.com/guoxiaoyan/p/9403630.html
Copyright © 2011-2022 走看看