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