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的話, 滿足條件的數據下標位置就會傳遞到 $ 字符中,在我們更新操作的時候就相當於 對這個位置 的元素進行操作

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM