MongoDB學習記錄(一)

- 簡介

MongoDB是一款強大、靈活,且易於擴展的通用型數據庫。同時它也是一個面向文檔(document-oriented)的數據庫,而不是關係型數據庫。它能擴展出非常多的功能。比如:

  • 索引
    MongoDB支持通用二級索引、允許多種快速查詢、且提供唯一索引、複合索引、地理空間索引以及全文索引。
  • 聚合
    MongoDB支持“聚合管道”。用戶能通過簡單的片段創建複雜的聚合,並通過數據庫自動優化。
  • 特殊的集合類型
    MongoDB支持存在時間有限的集合,適用於那些將在某個時期過期的數據,如會話(session)。類似的,,MongoDB也支持固定大小的集合,用於保存近期數據,如日誌。
  • 文件存儲(file storage)
    MongoDB支持一種非常易用的協議,用於大文件和文件元數據。

MongoDB並不具備一些在關係型數據庫中很普遍的功能,如連接(join)和複雜的多行事務(multirow transaction)。因爲在分佈式系統中這兩個功能難以高效地實現,所以忽略這些功能以得到更好的拓展性。


- 目錄


一、MongoDB基礎知識

  • 文檔是MongoDB中數據的基本單元
  • 集合(collection)可以看做是一個擁有動態模式(dynamic schema)的表
  • MongoDB的一個實例可以擁有多個互相獨立的數據庫(database),每一個數據庫都擁有自己的集合
  • 每一個文檔都有一個特殊的鍵“_id”,這個鍵在文檔中所屬的集合中是唯一的
  • MongoDB自帶JavaScript shell用於管理MongoDB的實例或數據操作


1.1 文檔

文檔就是鍵值對的一個有序集。文檔中的值可以使多種不同的數據類型(甚至可以是一個完整的內嵌文檔)。
文檔的鍵是字符串。除了少數例外情況,鍵可以使用任意的UTF-8字符。
- 鍵不能含有\0(空字符),它用於標識鍵的結尾。
- . 和$具有特殊意義,只能在特定環境下使用。通常這兩個字符作爲保留字符。

MongoDB不但區分類型,而且區分大小寫。例如下面的文檔就是不同的:

{“foo” : 3}
{“foo” : “3”};

{“foo” : 3}
{“Foo” : 3}

在文檔中不能包含重複的鍵。
文檔中的鍵值對是有序的:{“x” : 1, “y” : 2} 與 {“y” : 2, “x” : 1} 是不同的。通常,字段順序並不重要,無需讓數據庫模式依賴特定的字段順序(MongoDB會對字段重新排序)。


1.2 集合

集合就是一組文檔。如果將MongoDB中的一個文檔比作關係型數據庫中的一行的話,那麼一個集合則相當於一張表。

集合是動態模式的。這意味着一個集合裏面的文檔可以使各式各樣的。例如,下面兩個文檔可以存儲在同一個集合裏面:

{“greeting” : “hello world!”}
{“foo” : 5}

Q:既然集合可以放置任何文檔,那還需要使用多個集合嗎?

  • 將不同類型的文檔放置在不同的集合中以便於查詢和管理
  • 在查詢速度上,將文檔置於多個集合中也會帶來提升
  • 將同種類型文檔放置於一個集合當中會使得數據更加集中,使得查詢所需要的磁盤尋道操作更少
  • 索引是按照集合來定義的,所以在一個集合中只放入一種類型的文檔可以更有效的對集合進行索引

集合的命名需要滿足一些條件:

  • 集合名不能是空字符串(”“)
  • 集合名不能包含 \0 字符(空字符),這個字符標識集合名的結束。
  • 集合名不能以“system.”開頭,這是系統集合保留前綴。
  • 用戶創建的集合不能在集合名中包含保留字符 ‘$’ 。

子集合
在命名中使用“.”分隔不同命名空間的子集合。使用子集合使得組織結構更加清晰,甚至父集合可以不需要存在。


1.3 數據庫

多個文檔組成集合,多個集合組成數據庫。一個MongoDB實例可以承載多個數據庫,每個數據庫都有獨立的權限,不同數據庫放置於不同的文件中。

數據庫的命名與集合類似,主要條件如下:

  • 不能是空字符串(“”)
  • 不得含有/、\、.、”、*、<、>、:、|、?、$ (一個空格)、\0 (空字符)。基本桑只能使用ASCII中的字母和數字。
  • 數據庫名區分大小寫。
  • 數據庫名最多爲64字節。

    數據庫最終會編程文件系統裏的文件,而數據庫名就是對應的文件名。其中,admin,local,config這三個數據庫名是保留的。
    數據庫名加上集合名得到集合的完全限定名,即爲命名空間。



1.4 MongoDB 啓動!


MongoDB shell
MongoDB自帶一個JavaScript shell,可以通過shell與數據庫實例進行交互。它是一個功能完備的JavaScript解釋器,同時也是一個獨立的MongoDB客戶端。shell會連接到MongoDB服務器的數據庫,並將數據庫連接賦值給全局變量db。可通過db命令查看當前連接的數據庫名稱。或者可以使用use+數據庫名稱的方式切換數據庫。

shell中的基本操作

  • 創建
    insert函數可以將一個文檔添加到集合當中,首先需要創建一個JavaScript對象,然後通過insert函數添加到指定的集合。
doc = { title : "My first doc",
        content : "Hello World!",
        date : "2018/7/3 10:54:23"
      }
db.article.insert(doc)

如上對象爲有效的文檔對象,所以被添加到article集合當中,可以通過find方法查看該文檔。

db.article.find()
  • 讀取
    使用find和findOne方法可以用於查詢集合裏的文檔。
db.article.findOne()

find和findOne可接受一個查詢文檔作爲限定條件。使用find時,shell會自動顯示最多20個文檔。

  • 更新
    使用update方法可以對指定的文檔進行更新,update方法接受至少兩個參數,一個是限定條件,另一個是新的文檔。
//修改doc對象,爲其增添了一個comment鍵
doc.comments = []

//使用update將標題爲"My first doc"的文檔用doc進行替換
db.article.update({title : "My first doc"}, doc)
  • 刪除
    使用remove方法可以將指定的文檔永久刪除,如果沒有任何限定條件,則刪除集合內的所有文檔。
db.article.remove({title : "My first doc"})
db.article.remove()

MongoDB的數據類型

  • null
    用於表示空值或不存在的字段。
  • 布爾型
    包含true和false兩個值
  • 字符串
    任何的UTF-8字符串
  • 數值
    shell默認使用64位浮點型數值。對於整型值可使用NumberInt類或NumberLong類:
{"x" : NumberLong("3")}
{"x" : NumberInt("3")}
  • 日期
    存儲爲自新紀元以來經過的毫秒數,不存儲時區。創建日期對象時,應使用構造函數進行對象創建,而不是直接調用該函數以獲得日期字符串。
  • 正則表達式
    查詢時,使用正則表達式作爲查詢的限定條件,語法與JavaScript語法相同。
  • 數組
    數據列表或數據集可以表示爲數組。
  • 內嵌文檔
    被嵌套文檔作爲父文檔的值。
  • 對象id
    是一個12字節的ID,文檔的唯一標識。
{"_id" : ObjectId()}

其中ObjectId的生成方式如下圖:
ObjectId
如果在插入文檔時沒有”_id”鍵,系統則會自動爲其創建一個。
- 二進制數據

  • 代碼
{"x" = function(){/*......*/}}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章