和我一起學(xué)MongoDB(二)MongoDB的文檔和數(shù)據(jù)類(lèi)型

MongoDB的文檔知識(shí)

JSON

JSON是一種基于JavaScript的數(shù)據(jù)格式規(guī)范,將數(shù)據(jù)用純文本的模式結(jié)構(gòu)化的表示出來(lái)
JSON格式是由對(duì)象(Object)和數(shù)組(Array)所組成的
對(duì)象使用大括號(hào){}來(lái)表示,而數(shù)組使用中括號(hào)[]來(lái)表示

對(duì)象

對(duì)象是由鍵和值組成的,中間用冒號(hào)隔開(kāi)糖耸。對(duì)象之間沒(méi)有順序性
{key1:value1,key2:value2}
其中,key為數(shù)據(jù)的鍵,value為值
在JSON數(shù)據(jù)中,“值”可以是字符串(string)萌腿,數(shù)字(number),布爾值(Boolean)或空值(null)

  • 字符串使用雙引號(hào)表示抖苦,如"jason"
  • 數(shù)字直接使用證書(shū)或浮點(diǎn)數(shù)毁菱,如100、100.1
  • 布爾值使用true或者false
  • 空值使用null

數(shù)組

數(shù)組是有順序的锌历,各元素之間用逗號(hào)隔開(kāi)
"course":["english","history","mathematics"]

對(duì)象和數(shù)組的組合

通過(guò)對(duì)象和數(shù)據(jù)兩種結(jié)構(gòu)可以組合成復(fù)雜的數(shù)據(jù)結(jié)構(gòu)贮庞,如:

{
    "members": [
        {
        "FirstName": "Jason",
        "LastName": "Chang",
        "Email": "jason@mengkuo.com"
        }
        ,
        {
        "FirstName": "Amber",
        "LastName": "Cai",
        "Email": "amber@mengkuo.com"
        }
    ]
}

BSON

MongoDB基于JSON進(jìn)行了改良,使用BSON格式進(jìn)行存儲(chǔ)
BSON和JSON同樣是無(wú)模式化的存儲(chǔ)形式究西,可以支持內(nèi)嵌的文檔以及數(shù)組
BSON的類(lèi)型比JSON更全面窗慎,不過(guò)BSON一般在儲(chǔ)存上會(huì)占用較多的空間。

文檔

MongoDB的文檔不需要事先申明表結(jié)構(gòu)怔揩,也不用指明數(shù)據(jù)類(lèi)型及字段是否對(duì)應(yīng)捉邢。文檔的結(jié)構(gòu)與JSON、BSON類(lèi)似商膊,由對(duì)象和數(shù)組組成

原子性

MongoDB中伏伐,對(duì)于單個(gè)文檔的操作是具有原子性的。
MongoDB3.6及之前的版本不支持多文檔事務(wù)晕拆。到4.0版本藐翎,可以在副本集架構(gòu)中實(shí)現(xiàn)多文檔事務(wù)。在4.2版本中实幕,實(shí)現(xiàn)了分布式架構(gòu)的多文檔事務(wù)吝镣。

MongoDB的數(shù)據(jù)類(lèi)型

基本數(shù)據(jù)類(lèi)型

MongoDB使用的是BSON文檔格式,儲(chǔ)存數(shù)據(jù)時(shí)會(huì)區(qū)分類(lèi)型昆庇,每個(gè)類(lèi)型都有其對(duì)應(yīng)的數(shù)字末贾。如果需要修改字段類(lèi)型,必須依照對(duì)應(yīng)的名稱(chēng)或數(shù)字來(lái)修改
BSON類(lèi)型表

類(lèi)型 對(duì)應(yīng)數(shù)字 名稱(chēng) 備注
Double 1 double -
String 2 string -
Object 3 object -
Array 4 array -
Binary data 5 binData -
Undefined 6 undefined 棄用
ObjectId 7 objectId -
Boolean 8 bool -
Date 9 date -
Null 10 null -
Regular Expression 11 regex -
DBPointer 12 dbPointer 棄用
JavaScript 13 javascript
Symbol 14 symbol 棄用
JavaScript(with scope) 15 javascriptWithScope -
32-bit integer 16 int -
Timestamp 17 timestamp -
64-bit integer 18 long -
Decimal128 19 decima MongoDB3.4以后的新類(lèi)型
Min Key -1 minKey -
Max Key 127 maxKey -

對(duì)象ID(ObjectId)

MongoDB文檔中有一個(gè)自動(dòng)生產(chǎn)的字段--_id整吆,此字段會(huì)被自動(dòng)指定為一個(gè)不重復(fù)的值拱撵,如果不對(duì)其進(jìn)行定義,則MongoDB的驅(qū)動(dòng)程序在寫(xiě)入數(shù)據(jù)時(shí)會(huì)子生成一個(gè)類(lèi)型為ObjectId的唯一值表蝙。
MongoDB默認(rèn)用ObjectId作為主鍵拴测,ObjectId由12byte的字符組成。

  • 4byte UNIX時(shí)間戳
    將以秒為單位的時(shí)間戳(ISOData().getTime()/1000)轉(zhuǎn)成十六進(jìn)制數(shù)字
  • 3byte 運(yùn)行MongoDB的機(jī)器
  • 2byte 生成此id的進(jìn)程
  • 3byte 一個(gè)以隨機(jī)數(shù)開(kāi)始的計(jì)數(shù)器生成的值
    由于ObjectID中嵌入了時(shí)間類(lèi)型府蛇,可以通過(guò)它來(lái)獲取文檔的寫(xiě)入時(shí)間
> db.foo.findOne()._id.getTimestamp()
ISODate("2022-01-05T04:00:08Z")

子文檔

文檔本身為一組“鍵值對(duì)”集索,值的對(duì)象可以是許多類(lèi)型數(shù)據(jù)的集合,當(dāng)值的對(duì)象是一個(gè)文檔時(shí),我們稱(chēng)之為子文檔

數(shù)組

MongoDB可以將數(shù)組作為一種數(shù)據(jù)類(lèi)型賦值給某個(gè)字段务荆。數(shù)組由零至多個(gè)元素組合而成妆距,放在中括號(hào)[]中,元素間用逗號(hào)隔開(kāi)函匕,且每個(gè)元素可以是不同的數(shù)據(jù)類(lèi)型毅厚,數(shù)組元素還可以是一個(gè)文檔
MongoDB能夠解讀數(shù)組結(jié)構(gòu),并指導(dǎo)如何在數(shù)組內(nèi)部有查詢(xún)數(shù)據(jù)浦箱,這樣就能夠方便的對(duì)數(shù)組里面的內(nèi)容進(jìn)行篩選查詢(xún)和創(chuàng)建索引

//創(chuàng)建含有數(shù)組的文檔
db.foo.insertMany([
    {id:"1",qty:125,lenWidth:[12,18]},
    {id:"2",qty:500,lenWidth:[14,25]},
    {id:"3",qty:180,lenWidth:[22,30]}
])
//查詢(xún)lenWidth>20的數(shù)據(jù)
db.foo.find({"lenWidth":{$gt:20}})
//只要數(shù)據(jù)內(nèi)任意一個(gè)元素的值大于20都符合條件,id為2和3的數(shù)據(jù)都會(huì)被查詢(xún)出來(lái)
//查詢(xún)lenWidth中第一個(gè)元素值大于20的數(shù)據(jù)(數(shù)組是從0開(kāi)始的)
db.foo.find({"lenWidth.0":{$gt:20}})
//只有id為3的值會(huì)被查詢(xún)出來(lái)

日期和時(shí)間

在MongoDB中,可以使用多種方法來(lái)創(chuàng)建時(shí)間

> Date() //取得字符串類(lèi)型的日期
Wed Jan 05 2022 11:55:24 GMT+0800
> new Date() //取得日期對(duì)象類(lèi)型的日期
ISODate("2022-01-05T03:56:13.240Z")
> ISODate() //取得日期對(duì)象類(lèi)型的日期
ISODate("2022-01-05T03:56:19.049Z")

ISODate使用的是UTC時(shí)間祠锣,等同于使用GMT時(shí)間酷窥,而我們所在的地區(qū)使用的是北京時(shí)間GMT+0800,兩者之間相差8個(gè)小時(shí)
可以使用new Date("<YYYY-mm-dd")的方法將字符串格式的日期轉(zhuǎn)換為ISODate格式

> new Date("2022-01-05")
ISODate("2022-01-05T00:00:00Z")

MongoDB中所應(yīng)用的日期類(lèi)型(Date)實(shí)際上就是通過(guò)ISODate()構(gòu)建的日期類(lèi)型伴网,因此與北京時(shí)間相差8個(gè)小時(shí)

var d1=Date()
> d1 instanceof Date //判斷d1是否是日期數(shù)據(jù)類(lèi)型
false 
> var d2=new Date()
> d2 instanceof Date
true
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蓬推,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子澡腾,更是在濱河造成了極大的恐慌沸伏,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件动分,死亡現(xiàn)場(chǎng)離奇詭異毅糟,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)澜公,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)姆另,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人坟乾,你說(shuō)我怎么就攤上這事迹辐。” “怎么了甚侣?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵明吩,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我殷费,道長(zhǎng)印荔,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任宗兼,我火速辦了婚禮躏鱼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘殷绍。我一直安慰自己染苛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著茶行,像睡著了一般躯概。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上畔师,一...
    開(kāi)封第一講書(shū)人閱讀 51,754評(píng)論 1 307
  • 那天娶靡,我揣著相機(jī)與錄音,去河邊找鬼看锉。 笑死姿锭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的伯铣。 我是一名探鬼主播呻此,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼腔寡!你這毒婦竟也來(lái)了焚鲜?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤放前,失蹤者是張志新(化名)和其女友劉穎忿磅,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體凭语,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡葱她,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了叽粹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片览效。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖虫几,靈堂內(nèi)的尸體忽然破棺而出锤灿,到底是詐尸還是另有隱情,我是刑警寧澤辆脸,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布但校,位于F島的核電站,受9級(jí)特大地震影響啡氢,放射性物質(zhì)發(fā)生泄漏状囱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一倘是、第九天 我趴在偏房一處隱蔽的房頂上張望亭枷。 院中可真熱鬧,春花似錦搀崭、人聲如沸叨粘。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)升敲。三九已至答倡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間驴党,已是汗流浹背瘪撇。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留港庄,地道東北人倔既。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像鹏氧,于是被迫代替她去往敵國(guó)和親叉存。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容