MongoDB以BSON格式的文檔(Documents)形式存儲。Databases中包含集合(Collections),集合(Collections)中存儲文檔(Documents)。
BSON是一個二進制形式的JSON文檔,它比JSON包含更多的數據類型。對於BSON規格,可參見bsonspec.org,也可參考BSON類型。
Databases
在MongoDB中,databases保存文檔(Documents)的集合(Collections)。
在Mongo Shell中,通過使用use <db>
命令來選中database,就像下面的例子:
use myDB |
創建Database
如果database不存在,MongoDB會在第一次為database存儲數據的時候創建。因此,你可以直接切換到一個不存在的數據庫,然后執行下面的語句:
use myNewDB |
insert()
操作會創建名為myNewDB的database和名為myNewCollection1的collection(如果他們不存在的話)。
Collections
MongoDB在collections中存儲文檔(documents)。Collections類似於關系型數據庫中的表(tables)。
創建Collection
如果collection不存在,MongoDB會在第一次為collection存儲數據的時候創建。
db.myNewCollection2.insert( { x: 1 } ) |
無論是insert()還是createIndex()操作,都會創建它們各自指定的收集,如果他們不存在的話。
顯式創建
MongoDB提供db.createCollection()方法來顯式創建一個collection,同時還能設置各種選項,例如:設置最大尺寸和文檔校驗規則。如果你沒有指定這些選項,那么你就不需要顯式創建collection,因為MongoDB會在你創建第一個數據的時候自動創建collection。
若要修改這些collection選擇,可查看collMod。
Documents校驗
3.2.x版本新增內容。
默認情況下,collection不要求文檔有相同的結構;例如,在一個collection的文檔不必具有相同的fields,對於單個field在一個collection中的不同文檔中可以是不同的數據類型。
從MongoDB 3.2開始,你可以在對collection進行update和insert操作的時候執行文檔(documents)校驗規則。具體可參見文檔驗證的詳細信息。
Documents
Document結構
MongoDB的文件是由field和value對的結構組成,例如下面這樣的結構:
{ |
value值可以是任何BSON數據類型,包括:其他document,數字,和document數組。
例如下面的document,包含各種不同類型的值:
var mydoc = { |
上面例子中的各fields有下列數據類型:
- _id:ObjectId類型
- name:一個嵌入的document,包含first和last字段
- birth和death:Date類型
- contribs:字符串數組
- views:NumberLong類型
Field名
Field名是一個字符串。
Documents中的filed名有下列限制:
- _id被保留用於主鍵;其值必須是集合中唯一的、不可變的、並且可以是數組以外的任何數據類型
- 不能以美元符號
$
開頭 - 不能包含點字符
.
- 不能包含空字符
Field Value限制
對於索引的collections,索引字段中的值有最大長度限制。詳情請參見Maximum Index Key Length。
圓點符號
MongoDB中使用圓點符號.
訪問數組中的元素,也可以訪問嵌入式Documents的fields。
Arrays數組
通過圓點符號.
來鏈接Arrays數組名字和從0開始的數字位置,來定位和訪問一個元素數組:
"<array>.<index>" |
舉例:對於下面的document:
{ |
要訪問contribs數組中的第三個元素,可以這樣訪問:
"contribs.2" |
嵌入式Documents
通過圓點符號.
來鏈接嵌入式document的名字和field名,來定位和訪問嵌入式document:
"<embedded document>.<field>" |
舉例:對於下面的document:
{ |
要訪問name中的last字段,可以這樣使用:
"name.last" |
Documents限制
Documents有下面這些屬性和限制:
Document大小限制
每個BSON文檔的最大尺寸為16兆字節。
最大文檔大小有助於確保一個單個文檔不會使用過量的內存,或通信過程中過大的帶寬占用。
若要存儲超過最大尺寸的文檔,MongoDB提供了GridFS API。可以看mongofiles和更多有關GridFS的文檔
Document Field順序
MongoDB中field的順序默認是按照寫操作的順序來保存的,除了下面幾種情況:
- _id總是document的第一個field
- 可能會導致文檔中的字段的重新排序的更新,包括字段名重命名。
在2.6版本起,MongoDB開始積極地嘗試保留document中field的順序。
_id字段
_id字段有以下行為和限制:
- 默認情況下,MongoDB會在創建collection時創建一個_id字段的唯一索引
- _id字段總是documents中的第一個字段。如果服務器接收到一個docuement,它的第一個字段不是_id,那么服務器會將_id字段移在開頭
- _id字段可以是除了array數組之外的任何BSON數據格式
以下是存儲_id值的常用選項:
- 使用ObjectId
- 最好使用自然的唯一標識符,可以節省空間並避免額外的索引
- 生成一個自動遞增的數字。請參閱創建一個自動遞增序列字段
- 在您的應用程序代碼中生成UUID。為了更高效的在collection和_id索引中存儲UUID值,可以用BSON的BinData類型存儲UUID。
大部分MongoDB驅動客戶端會包含_id字段,並且在發送insert操作的時候生成一個ObjectId。但是如果客戶端發送一個不帶_id字段的document,mongod會添加_id字段並產生一個ObjectId