[mongo] 1.3 Documents(文檔)
MongoDB將數(shù)據(jù)記錄存儲為BSON文檔。BSON是JSON文檔的二進制表示形式,比JSON包含更多的數(shù)據(jù)類型。有關(guān)BSON規(guī)范,請參見bsonspec.org。另請參閱BSON類型。
文檔結(jié)構(gòu)
MongoDB文檔由字段和值對(?field-and-value)組成,并具有以下結(jié)構(gòu):
{ field1 : value1 , field2 : value2 , field3 : value3 , ... fieldN : valueN }
字段的值可以是任何BSON數(shù)據(jù)類型,包括其他文檔,數(shù)組和文檔數(shù)組。例如,以下文檔包含各種類型的值:
var mydoc = { _id: ObjectId("5099803df3f4948bd2f98391"), name: { first: "Alan", last: "Turing" }, birth: new Date('Jun 23, 1912'), death: new Date('Jun 07, 1954'), contribs: [ "Turing machine", "Turing test", "Turingery" ], views : NumberLong(1250000) }
上面的字段具有以下數(shù)據(jù)類型:
_id擁有一個ObjectId。
name包含一個包含first和last字段 的嵌入式文檔。
birth并death保留Date類型的值。
contribs持有字符串?dāng)?shù)組。
views擁有NumberLong類型的值。
Field名稱
Field名稱是字符串。
文檔對字段名稱有以下限制:
字段名稱_id保留用作主鍵;它的值在集合中必須是唯一的,不可變的,并且可以是數(shù)組以外的任何類型。
字段名稱不能包含null字符。
頂級字段名稱不能以美元符號($)字符開頭。
否則,從MongoDB 3.6開始,服務(wù)器允許存儲包含點(即.)和美元符號(即?$)的字段名稱。
重要
MongoDB查詢語言不能總是有效地表達對字段名稱包含這些字符的文檔的查詢(請參閱SERVER-30575)。
盡管支持在查詢語句中添加$和?.,MongoDB的官方驅(qū)動程序不推薦也不支持在字段名稱使用$和?.。
BSON文檔可能有多個具有相同名稱的字段。但是,大多數(shù)MongoDB接口使用不支持重復(fù)字段名稱的結(jié)構(gòu)(例如,哈希表)來表示MongoDB。如果需要處理具有多個同名字段的文檔,請參見驅(qū)動程序的驅(qū)動程序文檔。
通過內(nèi)部的MongoDB進程創(chuàng)建的有些文件可能有重復(fù)的字段,但是沒有MongoDB進程會不斷地添加重復(fù)字段到現(xiàn)有的用戶文檔。
字段值限制
點 符號
MongoDB使用點符號訪問訪問數(shù)組的元素,訪問嵌入式文檔的字段。
數(shù)組(arrays)
要通過從零開始的索引位置指定或訪問數(shù)組的元素,請將數(shù)組名稱與點(.)和從零開始的索引位置連接起來,并用引號引起來:
"
例如,給定文檔中的以下字段:
{ ... contribs: [ "Turing machine", "Turing test", "Turingery" ], ... }
要指定contribs數(shù)組中的第三個元素,請使用點符號"contribs.2"。
有關(guān)查詢數(shù)組的示例,請參見:
查詢數(shù)組
查詢嵌入式文檔數(shù)組
另外
$[]?用于更新操作的所有位置運算符,
$[/
$?用于更新操作的位置運算符,
$?數(shù)組索引位置未知時的投影運算符
在數(shù)組中查詢帶數(shù)組的點表示法示例。
嵌入式文件
要使用點符號指定或訪問嵌入式文檔的字段,請將嵌入式文檔名稱與點(.)和字段名稱連接在一起,并用引號引起來:
"
例如,給定文檔中的以下字段:
{ ... name: { first: "Alan", last: "Turing" }, contact: { phone: { type: "cell", number: "111-222-3333" } }, ... }
要指定在字段中命名last的name字段,請使用點符號"name.last"。
要在在phone文檔中contact字段的number,請使用點號"contact.phone.number"。
有關(guān)查詢嵌入式文檔的示例,請參見:
查詢嵌入/嵌套文檔
查詢嵌入式文檔數(shù)組
文件限制
文檔具有以下屬性:
文件大小限制
BSON文檔的最大大小為16 MB。
最大文檔大小有助于確保單個文檔不會使用過多的RAM或在傳輸過程中占用過多的帶寬。要存儲大于最大大小的文檔,MongoDB提供了GridFS API。有關(guān)GridFS的更多信息,請參見mongofiles和驅(qū)動程序的文檔。
文檔字段順序
除以下情況外,MongoDB會在執(zhí)行寫操作后保留文檔字段的順序:
該_id字段始終是文檔中的第一個字段。
包含renaming字段名稱的更新可能會導(dǎo)致文檔中字段的重新排序。
_id段
在MongoDB中,存儲在集合中的每個文檔都需要一個唯一的?_id字段作為主鍵。如果插入的文檔省略了該_id字段,則MongoDB會自動為該字段生成一個ObjectId_id。
這也適用于通過upsert:true通過更新操作插入的文檔。
_id字段具有以下特性和約束:
默認情況,MongoDB_id在創(chuàng)建集合期間會在字段上創(chuàng)建唯一索引。
_id字段始終是文檔中的第一個字段。如果服務(wù)器首先接收到?jīng)]有該_id字段的文檔,則服務(wù)器會將字段移到開頭。
_id字段可以包含除數(shù)組以外的任何BSON數(shù)據(jù)類型的值。
警告
為確保復(fù)制正常進行,務(wù)必在_id?字段中存儲BSON正則表達式類型的值。
以下是用于存儲的值的常用選項_id:
使用一個ObjectId。
使用自然的唯一標(biāo)識符(如果有)。這樣可以節(jié)省空間并避免附加索引。
生成一個自動遞增的數(shù)字。
在您的應(yīng)用程序代碼中生成一個UUID。為了在集合和_id?索引中更有效地存儲UUID值,請將UUID存儲為BSONBinData類型的值。
在以下情況下,BinData更有效地將類型為索引的鍵存儲在索引中:
二進制子類型的值在0-7或128-135的范圍內(nèi),并且
字節(jié)數(shù)組的長度為:0、1、2、3、4、5、6、7、8、10、12、14、16、20、24或32。
使用驅(qū)動程序的BSON UUID工具生成UUID。請注意,驅(qū)動程序?qū)崿F(xiàn)可能會以不同的方式實現(xiàn)UUID序列化和反序列化邏輯,這可能與其他驅(qū)動程序不完全兼容。請參閱您的驅(qū)動程序文檔,以獲取有關(guān)UUID互操作性的信息。
注意
大多數(shù)MongoDB驅(qū)動程序客戶端將包括該_id字段并ObjectId在將插入操作發(fā)送到MongoDB之前生成一個;但是,如果客戶發(fā)送的文檔中沒有_id?字段,mongod則會添加該_id字段并生成ObjectId。
數(shù)據(jù)結(jié)構(gòu)的其他用途
除了定義數(shù)據(jù)記錄外,MongoDB還在整個文檔結(jié)構(gòu)中使用,包括但不限于:查詢過濾器,更新規(guī)范文檔和索引規(guī)范文檔
查詢過濾器
查詢過濾器文檔指定確定用于選擇哪些記錄以進行讀取,更新和刪除操作的條件。
您可以使用
{
有關(guān)示例,請參見:
查詢文件
查詢嵌入/嵌套文檔
查詢數(shù)組
查詢嵌入式文檔數(shù)組
更新規(guī)范文件
更新規(guī)范文檔使用更新運算符來指定要在db.collection.update()操作期間在特定字段上執(zhí)行的數(shù)據(jù)修改。
{
有關(guān)示例,請參閱更新規(guī)范。
索引規(guī)范文檔
索引規(guī)范文檔定義了要索引的字段和索引類型:
{
Further Reading
For more information on the MongoDB document model, download the?MongoDB Application Modernization Guide.
The download includes the following resources:
Presentation on the methodology of data modeling with MongoDB
White paper covering best practices and considerations for migrating to MongoDB from an?RDBMS?data model
Reference MongoDB schema with its RDBMS equivalent
Application Modernization scorecard
MongoDB 云數(shù)據(jù)庫 GaussDB(for Mongo) 數(shù)據(jù)庫
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。