這個系列的筆記是我在學習MongoDB過程中記錄的一些重點,留給自己以后查閱惶我。不一定包含所有的知識妈倔。
數(shù)據(jù)庫和集合
Databases:
使用use <db>
來選擇一個數(shù)據(jù)庫。如果數(shù)據(jù)庫不存在绸贡,mongoDB會在第一次存儲數(shù)據(jù)時創(chuàng)建這個數(shù)據(jù)庫盯蝴。比如:
use <db>
db.<collection>.insert({...})
這個操作會創(chuàng)建數(shù)據(jù)庫,創(chuàng)建一個集合听怕,并向集合中插入數(shù)據(jù)捧挺。
Collections
MongoDB在集合中存儲文檔,集合和關(guān)系型數(shù)據(jù)庫中的表很類似尿瞭。當集合不存在時闽烙,向集合中插入數(shù)據(jù)即可同時創(chuàng)建集合黑竞。
此外疏旨,MongoDB提供了方法db.createCollection()
來顯式的創(chuàng)建集合,它可以在創(chuàng)建初設(shè)置一些額外的選項遏匆,比如文檔的最大數(shù)量、是否自動創(chuàng)建索引等幅聘。但是如果你不需要設(shè)置這些選項,那就使用存儲數(shù)據(jù)來創(chuàng)建集合。
文檔校驗
默認情況下撕瞧,一個集合不會要求下面的文檔有相同的schema(即不要求有相同的字段及其相同的類型)。然而從3.2版本開始巩掺,你可以在更新和插入操作時對集合執(zhí)行文檔校驗規(guī)則胖替。
修改文檔結(jié)構(gòu)
要更改集合中文檔的結(jié)構(gòu)豫缨,比如添加新的字段,刪除已有字段或者更改字段類型燃箭,可以直接更新文檔來得到新的結(jié)構(gòu)招狸。
Capped Collections
MongoDB 固定集合(Capped Collections)是性能出色且有著固定大小的集合邻薯,對于大小固定,我們可以想象其就像一個環(huán)形隊列累榜,當集合空間用完后灵嫌,再插入的元素就會覆蓋最初始的頭部的元素醒第。
固定集合的具體問題以后再談。
文檔
鍵的命名規(guī)則
-
_id
被用來作為主鍵形病,它的值必須在集合中是唯一且不變的。它可以是除數(shù)組以外的其它類型量瓜。 - 不能用
$
開頭途乃。 - 不能包含
.
。 - 不能包含
null
耍共。 - 不能包含重復的鍵。
Dot Notation(圓點符號)
MongoDB使用.
去訪問數(shù)組內(nèi)的元素和內(nèi)嵌文檔的鍵杠纵。
數(shù)組
數(shù)組的下標從0開始比藻,可以這樣訪問數(shù)組內(nèi)的元素:<array>.<index>
倘屹。比如
{
...
arrays:["first","second","third"]
}
要訪問數(shù)組的第三個元素,可以這樣arrays.2
群凶。
內(nèi)嵌文檔
可以這樣訪問內(nèi)嵌文檔中的值:<embedded document>.<field>
请梢。比如:
{
...
name:{first:"Alan",last:"Turing"}
}
要訪問last name,可以這樣name.last
毅弧。
文檔的規(guī)則
文檔大小的限制:文檔最大16m当窗。如果要超出這個大小,可以使用GridFS API
崖面。
文檔鍵的順序:
-
_id
一直是文檔的第一個鍵巫员。 - 更新操作可能會使鍵的順序重排,在2.6版本后赶掖,MongoDB會盡量保留順序不變。
通常用以下方法存儲_id
:
- 使用
ObjectId
奢赂。 - 允許的情況下膳灶,可以使用自然條件下獨一無二的標識符。這樣可以節(jié)省空間序厉,且避免了額外的索引聋迎。
- 使用一個自增的數(shù)字枣耀。
- 使用UUID。
除此之外牺堰,在查詢操作伟葫,更新操作以及索引中都用到了文檔院促。
BSON的類型
BSON支持以下的數(shù)據(jù)類型:
每個數(shù)據(jù)類型都有一個對應(yīng)的數(shù)字和字符串別名常拓。可以使用
$type
來利用BSON類型查詢需要的文檔茎辐。
比較/排序的順序
當比較不同類型的數(shù)據(jù)時掂恕,MongoDB使用以下規(guī)則懊亡,從小到大為:
在3.0版本以后店枣,Date對象被排在Timestamp以前灌闺,之前的版本中桂对,兩者的排序順序是相同的鸠匀。
Date類型
BSON Date是一個64位整數(shù),是一個Unix時間戳宅此∨婪叮可以這樣創(chuàng)建時間:
new Date()
ISODate()
這兩種方法都會創(chuàng)建Date對象。
可以通過toString()
方法轉(zhuǎn)化為字符串璧亮。這個和javascript中的Date類一樣枝嘶。更多方法可以參照javascript中Date類的操作哑诊。