MongoDB快速入門


MongoDB是一個跨平台,面向文件的資料庫,提供高效能,高可用性和易於擴充套件。MongoDB是工作在集合和文件上一種概念。

資料數

資料庫是一個集合的物理容器。每個資料庫獲取其自己設定在檔案系統上的檔案。一個單一的MongoDB伺服器通常有多個資料庫。

集合

集合是一組MongoDB的檔案。它與一個RDBMS表是等效的。一個集合存在於資料庫中。集合不強制執行模式。集合中的文件可以有不同的欄位。通常情況下,在一個集合中的所有檔案都是類似或相關目的。

文件

文件是一組鍵值對。文件具有動態模式。動態模式是指,在同一個集合的檔案不必具有相同一組集合的文件欄位或結構,並且相同的欄位可以保持不同型別的資料。

範例文件

下面給出的範例顯示了一個部落格網站,僅僅是一個逗號分隔的鍵值對的文件結構。

{
   _id: ObjectId(7df78ad8902c)
   title: 'MongoDB Overview', 
   description: 'MongoDB is no sql database',
   by: 'yiibai tutorial',
   url: 'https://www.tw511.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 100, 
   comments: [	
      {
         user:'user1',
         message: 'My first comment',
         dateCreated: new Date(2011,1,20,2,15),
         like: 0 
      },
      {
         user:'user2',
         message: 'My second comments',
         dateCreated: new Date(2011,1,25,7,45),
         like: 5
      }
   ]
}

在Windows上安裝MongoDB

要在Windows上安裝MongoDB,首先從  http://www.mongodb.org/downloads 下載 MongoDB 的最新版本

現在,提取下載的檔案到c:\ 驅動器或其他位置。 確保壓縮檔案夾名稱是 mongodb-win32-i386-[version] 或 mongodb-win32-x86_64-[version]. 這裡 [version] 是MongoDB的下載版本。

現在,開啟命令提示字元並執行以下命令

C:\>move mongodb-win64-* mongodb
      1 dir(s) moved.
C:\>

如果提取 mondodb 在不同的位置,然後進入這個路徑通過命令 cd FOOLDER/DIR 現在執行上面給出的過程。


下面是簡單的安裝步驟,第一步:



第二步:選擇自定安裝(可以自己定義安裝目錄)



第三步:選擇安裝目錄




第四步:選擇安裝目錄



第五步:安裝完成!


 

如果安裝 MongoDB 在不同的位置(建議安裝到 D:\software),那麼需要設定路徑 dbpath 在 mongod.exe 指向 data 備用路徑。請看看下面的命令

在命令提示字元下導航到bin目錄,當前到 MongoDB 的安裝檔案夾。本教學中安裝檔案夾是(為了保持與本教學一致,建議也安裝到這個目錄,如果你喜歡折騰,那我攔也攔不住):D:\software

C:\Users\yiibai>d:
D:\>cd "software"
D:\software>cd MongoDB\Server\3.0\bin
D:\software\MongoDB\Server\3.0\bin> mongod.exe --dbpath "d:\software\MongoDB\Server\3.0\data" 

這將顯示在等待連線的控制台輸出訊息,指示 mongod.exe 成功執行過程。

現在執行的MongoDB,需要開啟一個命令提示字元,發出以下命令

D:\software\MongoDB\Server\3.0\bin>mongo.exe
MongoDB shell version: 3.0.4
connecting to: test
>db.test.save( { a: 1 } )
>db.test.find()
{ "_id" : ObjectId(5879b0f65a56a454), "a" : 1 }
>

這將顯示已安裝的 MongoDB 並成功執行。下一次當您要執行 MongoDB 只需要發出命令:

D:\software\MongoDB\Server\3.0\bin>mongod.exe --dbpath "d:\software\MongoDB\Server\3.0\data" 
D:\software\MongoDB\Server\3.0\bin>mongo.exe

出現錯誤:

D:\software\MongoDB\Server\3.0\bin>mongod.exe --dbpath "d:\software\MongoDB\Server\3.0\data"

2015-07-11T08:47:22.896+0800 I CONTROL  Hotfix KB2731284 or later update is not
installed, will zero-out data files
2015-07-11T08:47:22.896+0800 I STORAGE  [initandlisten] exception in initAndList
en: 29 Data directory d:\software\MongoDB\Server\3.0\data not found., terminating

解決辦法:在d:\software\MongoDB\Server\3.0\目錄下建立一個新目錄:data
註:再新開啟一個命令列視窗,用於執行 MongoDB 各種命令。


 

建立資料庫

MongoDB use DATABASE_NAME 用於建立資料庫。該命令如果資料庫不存在,將建立一個新的資料庫, 否則將返回現有的資料庫。

語法

use DATABASE語句的基本語法如下:

use DATABASE_NAME

例子:

如果想建立一個資料庫名稱為 <mydb>, 那麼 use DATABASE 語句應該如下:

>use mydb
switched to db mydb

要檢查當前選擇的資料庫使用命令 db

>db
mydb

如果想查詢資料庫列表,那麼使用命令 show dbs.

>show dbs
local     0.78125GB
test      0.23012GB

所建立的資料庫(mydb)不存在於列表中。要顯示的資料庫,需要至少插入一個文件進去。

>db.movie.insert({"name":"yiibai tutorials"})
>show dbs
local      0.78125GB
mydb       0.23012GB
test       0.23012GB

MongoDB的預設資料庫是test。 如果沒有建立任何資料庫,那麼集合將被儲存在測試資料庫。

刪除資料庫

MongoDB db.dropDatabase() 命令用於刪除現有的資料庫。

語法

dropDatabase()指令的基本語法如下:

db.dropDatabase()

這將刪除選定的資料庫。如果沒有選擇任何資料庫,那麼它會刪除預設的“test”資料庫

例子:

如果想刪除新的資料庫 <mydb>, 那麼 dropDatabase() 命令將如下所示:

>use mydb
switched to db mydb
>db.dropDatabase()
>{ "dropped" : "mydb", "ok" : 1 }
>

建立集合

MongoDB 的 db.createCollection(name, options) 用於建立集合。 在命令中, name 是要建立集合的名稱。 Options 是一個文件,用於指定集合的組態

引數 型別 描述
Name String 要建立的集合的名稱
Options Document (可選)指定有關記憶體大小和索引選項

選項引數是可選的,所以需要指定集合的唯一名字。

語法

createCollection()方法的基本語法如下

>use test
switched to db test
>db.createCollection("mycollection")
{ "ok" : 1 }
>

可以通過使用 show collections 命令來檢查建立的集合

>show collections
mycollection
system.indexes

選項列表

欄位 型別 描述
capped Boolean (可選)如果為true,它啟用上限集合。上限集合是一個固定大小的集合,當它達到其最大尺寸會自動覆蓋最老的條目。 如果指定true,則還需要指定引數的大小。
autoIndexID Boolean (可選)如果為true,自動建立索引_id欄位。預設的值是 false.
size number (可選)指定的上限集合位元組的最大尺寸。如果capped 是true,那麼還需要指定這個欄位。
max number (可選)指定上限集合允許的最大檔案數。

儘管插入文件,MongoDB首先檢查欄位集合的上限大小,那麼它會檢查最大欄位。

語法 :

>db.createCollection("mycol", { capped : true, autoIndexID : true, size : 6142800, max : 10000 } )
{ "ok" : 1 }
>

在MongoDB中並不需要建立集合。 當插入一些文件 MongoDB 會自動建立集合。

>db.yiibai.insert({"name" : "yiibai"})
>show collections
mycol
mycollection
system.indexes
yiibai
>

刪除集合

MongoDB 的 db.collection.drop() 用於從資料庫中刪除集合。

語法

drop() 命令的基本語法如下

db.COLLECTION_NAME.drop()

例子:

下面給出的例子將刪除給定名稱的集合:mycollection

>use mydb
switched to db mydb
>db.mycollection.drop()
true
>

插入文件

將資料插入到MongoDB集合,需要使用MongoDB 的 insert() 方法。

語法

insert()命令的基本語法如下:

>db.COLLECTION_NAME.insert(document)

例子

>db.mycol.insert({
   _id: ObjectId(7df78ad8902c),
   title: 'MongoDB Overview', 
   description: 'MongoDB is no sql database',
   by: 'yiibai tutorials',
   url: 'https://www.tw511.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 100
})

這裡 mycol 是我們的集合名稱,它是在之前的教學中建立。如果集合不存在於資料庫中,那麼MongoDB建立此集合,然後插入文件進去。

在如果我們不指定_id引數插入的文件,那麼 MongoDB 將為文件分配一個唯一的ObjectId。

_id 是12個位元組十六進位制數在一個集合的每個文件是唯一的。 12個位元組被劃分如下:

_id: ObjectId(4 bytes timestamp, 3 bytes machine id, 2 bytes process id, 3 bytes incrementer)

要以單個查詢插入多個文件,可以通過文件 insert() 命令的陣列方式。

例子

>db.post.insert([
{
   title: 'MongoDB Overview', 
   description: 'MongoDB is no sql database',
   by: 'yiibai tutorials',
   url: 'https://www.tw511.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 100
},
{
   title: 'NoSQL Database', 
   description: 'NoSQL database doesn't have tables',
   by: 'yiibai tutorials',
   url: 'http://www.tw511.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 20, 
   comments: [	
      {
         user:'user1',
         message: 'My first comment',
         dateCreated: new Date(2013,11,10,2,35),
         like: 0 
      }
   ]
}
])

查詢文件

要從集合查詢MongoDB資料,需要使用MongoDB的 find()方法。

語法

find()方法的基本語法如下

>db.COLLECTION_NAME.find()

find() 方法將在非結構化的方式顯示所有的檔案。 如果顯示結果是格式化的,那麼可以用pretty() 方法。

語法

>db.mycol.find().pretty()

例子

>db.mycol.find().pretty()
{
   "_id": ObjectId(7df78ad8902c),
   "title": "MongoDB Overview", 
   "description": "MongoDB is no sql database",
   "by": "yiibai tutorials",
   "url": "https://www.tw511.com",
   "tags": ["mongodb", "database", "NoSQL"],
   "likes": "100"
}
>

除了find()方法還有findOne()方法,僅返回一個文件。

RDBMS Where子句等效於MongoDB

查詢文件在一些條件的基礎上,可以使用下面的操作

操作 語法 範例 RDBMS等效語句
Equality {<key>:<value>} db.mycol.find({"by":"yiibai tutorials"}).pretty() where by = 'yiibai tutorials'
Less Than {<key>:{$lt:<value>}} db.mycol.find({"likes":{$lt:50}}).pretty() where likes < 50
Less Than Equals {<key>:{$lte:<value>}} db.mycol.find({"likes":{$lte:50}}).pretty() where likes <= 50
Greater Than {<key>:{$gt:<value>}} db.mycol.find({"likes":{$gt:50}}).pretty() where likes > 50
Greater Than Equals {<key>:{$gte:<value>}} db.mycol.find({"likes":{$gte:50}}).pretty() where likes >= 50
Not Equals {<key>:{$ne:<value>}} db.mycol.find({"likes":{$ne:50}}).pretty() where likes != 50

AND 在 MongoDB

語法

在 find()方法,如果您傳遞多個鍵通過","將它們分開,那麼MongoDB對待它就如AND條件一樣。基本語法如下所示:

>db.mycol.find({key1:value1, key2:value2}).pretty()

例子

下面給出的例子將顯示所有教學含“yiibai tutorials”和其標題是“MongoDB Overview”

>db.mycol.find({"by":"yiibai tutorials","title": "MongoDB Overview"}).pretty()
{
   "_id": ObjectId(7df78ad8902c),
   "title": "MongoDB Overview", 
   "description": "MongoDB is no sql database",
   "by": "yiibai tutorials",
   "url": "https://www.tw511.com",
   "tags": ["mongodb", "database", "NoSQL"],
   "likes": "100"
}
>

對於上面給出的例子相當於where子句:' where by='yiibai tutorials' AND title='MongoDB Overview' '。可以傳遞任何數目的鍵-值對在find子句。

OR 在 MongoDB

語法

要查詢基於OR條件的檔案,需要使用$or關鍵字。OR的基本語法如下所示:

>db.mycol.find(
   {
      $or: [
	     {key1: value1}, {key2:value2}
      ]
   }
).pretty()

例子

下面給出的例子將顯示所有撰寫含有 'yiibai tutorials' 或是標題為 'MongoDB Overview' 的教學

>db.mycol.find({$or:[{"by":"tutorials point"},{"title": "MongoDB Overview"}]}).pretty()
{
   "_id": ObjectId(7df78ad8902c),
   "title": "MongoDB Overview", 
   "description": "MongoDB is no sql database",
   "by": "yiibai tutorials",
   "url": "https://www.tw511.com",
   "tags": ["mongodb", "database", "NoSQL"],
   "likes": "100"
}
>

使用 AND 和 OR 在一起

例子

下面給出的例子顯示有喜歡數大於100 的文件,其標題要麼是 'MongoDB Overview' 或 'yiibai tutorials'. 等效於SQL的where子句:'where likes>10 AND (by = 'yiibai tutorials' OR title = 'MongoDB Overview')'

>db.mycol.find("likes": {$gt:10}, $or: [{"by": "yiibai tutorials"}, {"title": "MongoDB Overview"}] }).pretty()
{
   "_id": ObjectId(7df78ad8902c),
   "title": "MongoDB Overview", 
   "description": "MongoDB is no sql database",
   "by": "yiibai tutorials",
   "url": "https://www.tw511.com",
   "tags": ["mongodb", "database", "NoSQL"],
   "likes": "100"
}
>

更新文件

MongoDB的update()和save()方法用於更新文件到一個集合。 update()方法將現有的文件中的值更新,而save()方法使用傳遞到save()方法的文件替換現有的文件。

MongoDB Update() 方法

語法

update()方法的基本語法如下

>db.COLLECTION_NAME.update(SELECTIOIN_CRITERIA, UPDATED_DATA)

例子

考慮mycol集合有如下資料。

{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Yiibai Yiibai Overview"}

下面的例子將設定其標題“MongoDB Overview”的檔案為新標題為“New MongoDB Tutorial”

>db.mycol.update({'title':'MongoDB Overview'},{$set:{'title':'New MongoDB Tutorial'}})
>db.mycol.find()
{ "_id" : ObjectId(5983548781331adf45ec5), "title":"New MongoDB Tutorial"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Yiibai Tutorial Overview"}
>

預設情況下,MongoDB將只更新單一檔案,更新多,需要一個引數 'multi' 設定為 true。

>db.mycol.update({'title':'MongoDB Overview'},{$set:{'title':'New MongoDB Tutorial'}},{multi:true})

MongoDB Save() 方法

save() 方法取代,通過新文件到 save()方法

語法

mongodb 的 save()方法如下所示的基本語法:

>db.COLLECTION_NAME.save({_id:ObjectId(),NEW_DATA})

例子

下面的例子將替換該檔案_id '5983548781331adf45ec7'

>db.mycol.save(
   {
      "_id" : ObjectId(5983548781331adf45ec7), "title":"Yiibai Yiibai New Topic", "by":"Yiibai Yiibai"
   }
)
>db.mycol.find()
{ "_id" : ObjectId(5983548781331adf45ec5), "title":"Yiibai Yiibai New Topic", "by":"Yiibai Yiibai"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Yiibai Yiibai Overview"}
>

刪除文件

MongoDB 的 remove()方法用於從集合中刪除文件。remove()方法接受兩個引數。一個是標準缺失,第二是justOne標誌

  1. deletion criteria : 根據檔案(可選)刪除條件將被刪除。

  2. justOne : (可選)如果設定為true或1,然後取出只有一個文件。

語法

remove()方法的基本語法如下

>db.COLLECTION_NAME.remove(DELLETION_CRITTERIA)

例子

考慮mycol集合有如下資料。

{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Yiibai Yiibai Overview"}

下面的例子將刪除所有的檔案,其標題為 'MongoDB Overview'

>db.mycol.remove({'title':'MongoDB Overview'})
>db.mycol.find()
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Yiibai Toturials Overview"}
>

只刪除一個

如果有多個記錄,並要刪除僅第一條記錄,然後在 remove()方法設定引數 justOne 。

>db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)

刪除所有檔案

如果沒有指定刪除條件,則MongoDB將從集合中刪除整個檔案。這相當於SQL的 truncate 命令。

>db.mycol.remove()
>db.mycol.find()
>

MongoDB投影

mongodb投影意義是只選擇需要的資料,而不是選擇整個一個文件的資料。如果一個文件有5個欄位,只需要顯示3個,只從中選擇3個欄位。

MongoDB的find()方法,解釋了MongoDB中查詢文件接收的第二個可選的引數是要檢索的欄位列表。在MongoDB中,當執行find()方法,那麼它會顯示一個文件的所有欄位。要限制這一點,需要設定欄位列表值為1或0。1是用來顯示欄位,而0被用來隱藏欄位。

語法

find()方法的基本語法如下

>db.COLLECTION_NAME.find({},{KEY:1})

例子

考慮集合 myycol 有下列資料

{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Yiibai Yiibai Overview"}

下面的例子將顯示文件的標題,在查詢文件時。

>db.mycol.find({},{"title":1,_id:0})
{"title":"MongoDB Overview"}
{"title":"NoSQL Overview"}
{"title":"Yiibai Yiibai Overview"}
>

請注意在執行find()方法時_id欄位始終顯示,如果不想要顯示這個欄位,那麼需要將其設定為0

限制文件

MongoDB Limit() 方法

要在MongoDB中限制記錄,需要使用limit()方法。 limit() 方法接受一個數位型別的引數,這是要顯示的文件數量。

語法

limit()方法的基本語法如下

>db.COLLECTION_NAME.find().limit(NUMBER)

例子

考慮集合 myycol 有下列資料

{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Yiibai Yiibai Overview"}

下面的例子將只顯示2個文件,在查詢文件時。

>db.mycol.find({},{"title":1,_id:0}).limit(2)
{"title":"MongoDB Overview"}
{"title":"NoSQL Overview"}
>

如果不指定 limit()方法的引數數量,然後它會顯示集合中的所有文件。

MongoDB Skip() 方法

除了 limit()方法還有一個方法 skip()也接受數位型別引數並用於跳過檔案數。

語法

skip() 方法的基礎語法如下所示:

>db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

例子:

下面的例子將僅顯示第二個文件。

>db.mycol.find({},{"title":1,_id:0}).limit(1).skip(1)
{"title":"NoSQL Overview"}
>

請注意,skip() 方法的預設值是 0

文件排序

要排序MongoDB中的文件,需要使用 sort()方法。 sort() 方法接受一個包含欄位列表以及排序順序的文件。 要使用1和-1指定排序順序。1用於升序,而-1是用於降序。

語法

sort()方法的基本語法如下

>db.COLLECTION_NAME.find().sort({KEY:1})

例子

考慮集合 myycol 有如下資料

{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Yiibai Yiibai Overview"}

下面的例子將顯示的檔案排序按標題降序排序。

>db.mycol.find({},{"title":1,_id:0}).sort({"title":-1})
{"title":"Yiibai Yiibai Overview"}
{"title":"NoSQL Overview"}
{"title":"MongoDB Overview"}
>

請注意,如果不指定排序型別,那麼 sort() 方法將以升序排列文件。

MongoDB索引

索引支援查詢高效率執行。如果沒有索引,MongoDB必須掃描集合中的每一個文件,然後選擇那些符合查詢語句的文件。若需要 mongod 來處理大量資料,掃描是非常低效的。

索引是特殊的資料結構,儲存在一個易於設定遍歷形式的資料的一小部分。索引儲存在索引中指定特定欄位的值或一組欄位,並排序欄位的值。

要建立索引,需要使用MongoDB的ensureIndex()方法。

語法

ensureIndex()方法的基本語法如下

>db.COLLECTION_NAME.ensureIndex({KEY:1})

這裡鍵是要建立索引欄位,1是按名稱升序排序。若以按降序建立索引,需要使用 -1.

例子

>db.mycol.ensureIndex({"title":1})
>

在 ensureIndex()方法,可以通過多個欄位,來建立多個欄位索引。

>db.mycol.ensureIndex({"title":1,"description":-1})
>

ensureIndex() 方法還接受選項列表(這是可選),其列表如下:

引數 型別 描述
background Boolean 構建索引在後台以便建立索引不阻止其它資料庫活動。指定true時建立在後台。預設值是false.
unique Boolean 建立一個唯一的索引,以使集合將不接受插入的的文件,其中的索引關鍵字或鍵匹配索引的現有值。指定true以建立唯一索引。預設值是 false.
name string 索引的名稱。如果未指定,MongoDB通過連線索引的欄位和排序順序的名稱生成一個索引名。
dropDups Boolean 建立一個欄位唯一索引時可能會有重複。MongoDB索引鍵僅第一次出現,並從集合中刪除包含該鍵後續出現的所有文件。指定true以建立唯一索引。預設值是 false.
sparse Boolean 如果為true,索引只參照與指定的欄位的文件。這些索引使用更少的空間,但在某些情況下表現不同(特別是排序)。預設值是 false.
expireAfterSeconds integer 指定的值,以秒為單位,作為一個TTL控制MongoDB保留在此集合檔案多久。
v index version 索引版本號。預設的索引版本取決於mongod建立索引時執行的版本。
weights document 重量(weight )是一個數位,它是從1至99,999的數位,表示欄位相對於其它索引欄位在得分方面的意義。
default_language string 對於文字索引,並為詞干分析器和標記生成器列表中的語言決定了停用詞和規則。它的預設值: english.
language_override string 對於一個文字索引,包含在文件中指定欄位的名稱,語言來覆蓋預設語言。它的預設值:language.

MongoDB 聚合

聚合操作處理資料記錄並返回計算結果。從多個文件聚合分組運算元值,並可以執行多種對分組資料業務返回一個結果。 在SQL中的count(*),使用group by 與mongodb的聚合是等效的。 對於MongoDB的聚合,使用的是aggregate()方法。

語法

aggregate()方法的基本語法如下

>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

例子:

在集合中有以下資料:

{
   _id: ObjectId(7df78ad8902c)
   title: 'MongoDB Overview', 
   description: 'MongoDB is no sql database',
   by_user: 'Yiibai Yiibai ',
   url: 'https://www.tw511.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 100
},
{
   _id: ObjectId(7df78ad8902d)
   title: 'NoSQL Overview', 
   description: 'No sql database is very fast',
   by_user: 'Yiibai Yiibai',
   url: 'https://www.tw511.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 10
},
{
   _id: ObjectId(7df78ad8902e)
   title: 'Neo4j Overview', 
   description: 'Neo4j is no sql database',
   by_user: 'Neo4j',
   url: 'http://www.neo4j.com',
   tags: ['neo4j', 'database', 'NoSQL'],
   likes: 750
},

現在從上面的集合,如果想知道每一個使用者編寫的教學是多少,那麼使用aggregate()方法,如下圖所示的列表:

> db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
{
   "result" : [
      {
         "_id" : "Yiibai Yiibai",
         "num_tutorial" : 2
      },
      {
         "_id" : "Neo4j",
         "num_tutorial" : 1
      }
   ],
   "ok" : 1
}
>

用於上述用途將等效於sql查詢: select by_user, count(*) from mycol group by by_user

另外,在上述例子中,我們已經使用欄位by_user進行分組並計算總和,也就是by_user 出現各個次數。一個列表中可用的聚集表示式。

表示式 描述 範例
$sum 從集合累加所有文件中的定義值 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])
$avg 從集合中的所有文件計算所有給定值的平均值 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])
$min 從集合中獲取的所有檔案的最小的相應值 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])
$max 從集合中的所有文件中的相應值中獲取最大值 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])
$push 插入陣列值到文件中 db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])
$addToSet 插入值所產生的陣列到文件中,但不會產生重複 db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])
$first 從原始檔獲取根據分組的標頭檔案。通常,這使得只能意會再加上一些以前應用“$sort” -stage  db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])
$last 從原始檔獲取根據分組的最後檔案。通常,這使得只能意會再加上一些以前應用 “$sort”-stage. db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])

MongoDB 複製

複製是同步在多個伺服器上的資料過程。複製提供了冗餘和資料在不同的資料庫伺服器上的多個副本提高資料的可用性,複製防止在單個伺服器上丟失資料庫。 複製也可以從硬體故障和服務中斷中恢復。帶有資料的其他副本,可以選擇其中一個災難恢復,報告或備份。

為什麼要複製?

  • 為了讓資料安全
  • 資料的高(24*7)可用性
  • 災難恢復
  • 無停機維護(如備份,索引重建,壓縮)
  • 讀取縮放(額外的副本來讀取)
  • 副本集是透明的應用

MongoDB複製的工作原理

MongoDB通過使用副本集的複製來實現。副本集是一組承載同一個資料集的mongod範例。在副本的一個節點是接收所有的寫操作主節點。所有的範例,次級,應用操作從主以便它們具有相同的資料集。副本集只能有一個主節點。

  1. 副本集是一組兩個或更多個節點(通常至少3節點是必需的)。
  2. 在副本集一個節點是主節點和其餘的節點都是次要的。
  3. 所有的資料複製是從主到次節點。
  4. 在自動故障轉移或維護時,選建立了主要和一個新的主節點被選擇。
  5. 故障節點的恢復後,再次加入副本集,並可以作為一個輔助節點。

mongodb複製的典型圖如下圖,其中用戶端應用程式總是與主節點和主節點互動,然後將資料複製到輔助節點。

MongoDB Replication

副本集特徵

  • N個節點的叢集
  • 任何節點可為原發/主節點
  • 所有的寫操作進入到主節點
  • 自動故障轉移
  • 自動恢復
  • 協商一致選擇主節點

建立一個副本集

在本教學中,我們將獨立的 mongod 範例轉換為副本集。 要轉換為副本集,按照以下的步驟:

  • 關閉已經執行的 MongoDB 伺服器。
  • 現在,通過指定--replSet選項啟動 MongoDB 伺服器。--replSet 的基本語法如下:

    mongod --port "PORT" --dbpath "YOUR_DB_DATA_PATH" --replSet "REPLICA_SET_INSTANCE_NAME"

    例子

    mongod --port 27017 --dbpath "D:\software\MongoDB\Server\3.0\mongodb\data" --replSet rs0

    這將啟動一個名為rs0的一個mongod範例,埠為: 27017

  • 現在開啟啟動命令提示字元,然後連線到mongod範例
  • 在Mongo的用戶端使用命令rs.initiate()來啟動一個新的副本集
  • 要檢查副本設定組態,則使用命令rs.conf()

  • 要檢查副本集發行的狀態,使用命令rs.status()

MongoDB建立備份

MongoDB資料轉儲

要使用 mongodump 命令來執行 MongoDB 資料庫備份。此命令將轉儲伺服器的所有資料到轉儲目錄。有許多可用的選項,通過它可以限制資料量或建立遠端伺服器備份。

語法

mongodump命令的基本語法如下

>mongodump

例子

啟動 mongod 伺服器。假設 mongod 伺服器執行在本地主機和埠 27017. 現在開啟一個命令提示字元,然後轉到你的MongoDB範例的bin目錄,然後輸入命令mongodump。

考慮mycol集合有以下資料。

>mongodump

該命令將連線到伺服器127.0.0.1和埠27017,並備份所有資料到伺服器上的目錄: /bin/dump/. 命令的輸出如下所示:

DB Stats

以上是可用的選項能夠與mongodump命令一起使用的列表。

此命令將只備份指定資料庫到指定的路徑

語法 描述 範例
mongodump --host HOST_NAME --port PORT_NUMBER 這個命令將備份指定的mongod範例的所有資料庫 mongodump --host tw511.com --port 27017
mongodump --dbpath DB_PATH --out BACKUP_DIRECTORY   mongodump --dbpath /data/db/ --out /data/backup/
mongodump --collection COLLECTION --db DB_NAME 此命令將僅備份指定的特定資料庫集合 mongodump --collection mycol --db test

資料恢復

要恢復備份的MongoDB資料,則使用mongorestore命令。該命令將從備份目錄恢復所有的資料。

語法

mongorestore命令的基本語法

>mongorestore

這個命令的輸出如下所示:

DB Stats