安裝 MongoDB
- Windowns、Ubuntu17.10 下安裝 MongoDB教程在此
MongoDB 幫助
要想獲取命令列表,在 mongodb 客戶端中輸入 db.help():
> db.help()
MongoDB 統(tǒng)計信息
要想獲取 MongoDB 服務(wù)器的統(tǒng)計信息,在 mongodb 客戶端中輸入 db.stat():
> db.stats()
創(chuàng)建數(shù)據(jù)庫
use 命令
MongoDB 用 use + 數(shù)據(jù)庫名稱 的方式來創(chuàng)建數(shù)據(jù)庫。 use 會創(chuàng)建一個新的數(shù)據(jù)庫,如果該數(shù)據(jù)庫存在,則返回這個數(shù)據(jù)庫。
語法格式
use 語句的基本格式如下:
use DATABASE_NAME
范例
創(chuàng)建一個名為mydb的數(shù)據(jù)庫,使用 use 語句如下:
>use mydb
switched to db mydb
# 使用命令 db 檢查當(dāng)前選定的數(shù)據(jù)庫。
>db
mydb
使用命令 show dbs 來檢查數(shù)據(jù)庫列表。
>show dbs
local 0.78125GB
test 0.23012GB
剛創(chuàng)建的數(shù)據(jù)庫(mydb)沒有出現(xiàn)在列表中。為了讓數(shù)據(jù)庫顯示出來,至少應(yīng)該插入一個文檔。
>db.movie.insert({"name":"tutorials point"})
>show dbs
local 0.78125GB
mydb 0.23012GB
test 0.23012GB
在 MongoDB 中,默認(rèn)的數(shù)據(jù)庫是 test,如果你沒有創(chuàng)建任何數(shù)據(jù)庫,那么集合就會保存在 test 數(shù)據(jù)庫中。
刪除數(shù)據(jù)庫
dropDatabase() 方法
MongoDB 的 dropDatabase()命令用于刪除已有數(shù)據(jù)庫。
語法格式
dropDatabase() 命令的語法格式如下:
db.dropDatabase()
它將刪除選定的數(shù)據(jù)庫。如果沒有選定要刪除的數(shù)據(jù)庫,則它會將默認(rèn)的 test 數(shù)據(jù)庫刪除。
范例
首先使用 show dbs 來列出已有的數(shù)據(jù)庫。
>show dbs
local 0.78125GB
mydb 0.23012GB
test 0.23012GB
如果想刪除新數(shù)據(jù)庫 <mydb> ,如下面這樣使用 dropDatabase()方法:
>use mydb
switched to db mydb
>db.dropDatabase()
{ "dropped" : "mydb", "ok" : 1 }
創(chuàng)建集合
createCollection() 方法
在 MongoDB 中,創(chuàng)建集合采用 db.createCollection(name, options)方法。
語法格式
createCollection() 方法的基本格式如下:
db.createCollection(name, options)
在該命令中, name 是所要創(chuàng)建的集合名稱。 options 是一個用來指定集合配置的文檔。
| 參數(shù) | 類型 | 描述 |
|---|---|---|
| name | 字符串 | 所要創(chuàng)建的集合名稱 |
| options | 文檔 | 可選。指定有關(guān)內(nèi)存大小及索引的選項 |
參數(shù) options 是可選的,所以你必須指定的只有集合名稱。下表列出了所有可用選項:
| 字段 | 類型 | 描述 |
|---|---|---|
| capped | 布爾 | (可選)如果為 true,則創(chuàng)建固定集合。固定集合是指有著固定大小的集合,當(dāng)達(dá)到最大值時,它會自動覆蓋最早的文檔。當(dāng)該值為 true 時,必須指定 size 參數(shù)。 |
| autoIndexID | 布爾 | (可選)如為 true,自動在 _id 字段創(chuàng)建索引。默認(rèn)為 false。 |
| size | 數(shù)值 | (可選)為固定集合指定一個最大值(以字節(jié)計)。如果 capped 為 true,也需要指定該字段。 |
| max | 數(shù)值 | (可選)指定固定集合中包含文檔的最大數(shù)量。在插入文檔時,MongoDB 首先檢查固定集合的 size 字段,然后檢查 max 字段。 |
范例
不帶參數(shù)的 createCollection() 方法的基本格式為:
>use test
switched to db test
>db.createCollection("mycollection")
{ "ok" : 1 }
可以使用 show collections 來查看創(chuàng)建了的集合。
>show collections
mycollection
system.indexes
下面是帶有幾個關(guān)鍵參數(shù)的 createCollection()的用法:
>db.createCollection("mycol", { capped : true, size : 6142800} )
{ "ok" : 1 }
在 MongoDB 中,你不需要創(chuàng)建集合。當(dāng)你插入一些文檔時,MongoDB 會自動創(chuàng)建集合。
>db.tutorialspoint.insert({"name" : "tutorialspoint"})
>show collections
mycol
mycollection
system.indexes
tutorialspoint
刪除集合
drop() 方法
MongoDB 利用 db.collection.drop()來刪除數(shù)據(jù)庫中的集合。
語法格式
drop() 命令的基本格式如下:
db.COLLECTION_NAME.drop()
范例
首先檢查在數(shù)據(jù)庫 mydb 中已有集合:
>use mydb
switched to db mydb
>show collections
mycol
mycollection
system.indexes
tutorialspoint
接著刪除集合 mycollection。
>db.mycollection.drop()
true
如果成功刪除選定集合,則 drop()方法返回 true,否則返回false。
數(shù)據(jù)類型
MongoDB 支持如下數(shù)據(jù)類型:
- String:字符串。存儲數(shù)據(jù)常用的數(shù)據(jù)類型。在 MongoDB 中,UTF-8 編碼的字符串才是合法的。
- Integer:整型數(shù)值。用于存儲數(shù)值。根據(jù)你所采用的服務(wù)器,可分為 32 位或 64 位。
- Boolean:布爾值。用于存儲布爾值(真/假)。
- Double:雙精度浮點值。用于存儲浮點值。
- Min/Max keys:將一個值與 BSON(二進(jìn)制的 JSON)元素的最低值和最高值相對比。
- Arrays:用于將數(shù)組或列表或多個值存儲為一個鍵。
- Timestamp:時間戳。記錄文檔修改或添加的具體時間。
- Object:用于內(nèi)嵌文檔。
- Null:用于創(chuàng)建空值。
- Symbol:符號。該數(shù)據(jù)類型基本上等同于字符串類型,但不同的是,它一般用于采用特殊符號類型的語言。
- Date:日期時間。用 UNIX 時間格式來存儲當(dāng)前日期或時間。你可以指定自己的日期時間:創(chuàng)建 Date 對
象,傳入年月日信息。 - Object ID:對象 ID。用于創(chuàng)建文檔的 ID。
- Binary Data:二進(jìn)制數(shù)據(jù)。用于存儲二進(jìn)制數(shù)據(jù)。
- Code:代碼類型。用于在文檔中存儲 JavaScript 代碼。
- Regular expression:正則表達(dá)式類型。用于存儲正則表達(dá)式。
插入文檔
insert() 方法
要想將數(shù)據(jù)插入 MongoDB 集合中,需要使用insert()或 save()方法。
insert()或 save()方法d的區(qū)別是當(dāng)主鍵重復(fù)時,insert()會報錯, save()會覆蓋原有內(nèi)容。
語法格式
insert()方法的基本格式為:
db.COLLECTION_NAME.insert(document)
范例 1
> 傳入一條數(shù)據(jù) 格式:db.mycol.insert({})
>db.mycol.insert({
title: 'MongoDB Overview',
description: 'MongoDB is no sql database',
by: 'tutorials point',
url: 'http://www.tutorialspoint.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
mycol 是上一節(jié)所創(chuàng)建的集合的名稱。如果數(shù)據(jù)庫中不存在該集合,那么 MongoDB 會創(chuàng)建該集合,并向其中插入文檔。
在插入的文檔中,如果我們沒有指定 _id 參數(shù),那么 MongoDB 會自動為文檔指定一個唯一的 ID。
為了,你可以將用 insert() 方法傳入一個文檔數(shù)組,范例如下:
范例 2
> 傳入多條數(shù)據(jù) 格式:db.mycol.insert([{},{},{}])
>db.post.insert([
{
title: 'MongoDB Overview',
description: 'MongoDB is no sql database',
by: 'tutorials point',
url: 'http://www.tutorialspoint.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
},
{
title: 'NoSQL Database',
description: 'NoSQL database doesn't have tables',
by: 'tutorials point',
url: 'http://www.tutorialspoint.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 20,
comments: [
{
user:'user1',
message: 'My first comment',
dateCreated: new Date(2013,11,10,2,35),
like: 0
}
]
}
])
也可以用 db.post.save(document)插入文檔。如果沒有指定文檔的 _id ,那么save() 就和 insert()完全一樣了。如果指定了文檔的 _id ,那么它會覆蓋掉含有 save() 方法中指定的 _id 的文檔的全部數(shù)據(jù)。
查詢文檔
find() 方法
要想查詢 MongoDB 集合中的數(shù)據(jù),使用 find() 方法。
語法格式
find() 方法的基本格式為:
db.COLLECTION_NAME.find()
find()方法會以非結(jié)構(gòu)化的方式來顯示所有文檔。
pretty() 方法用格式化方式顯示結(jié)果,使用的是 pretty() 方法。
語法格式
>db.COLLECTION_NAME.find().pretty()
范例
>db.mycol.find().pretty()
{
"_id": ObjectId(7df78ad8902c),
"title": "MongoDB Overview",
"description": "MongoDB is no sql database",
"by": "tutorials point",
"url": "http://www.tutorialspoint.com",
"tags": ["mongodb", "database", "NoSQL"],
"likes": "100"
}
除了 find() 方法之外,還有一個 findOne() 方法,它只返回一個文檔。
MongoDB 中類似于 WHERE 子句的語句
如果想要基于一些條件來查詢文檔,可以使用下列操作。
| 操作 | 格式 | 范例 | RDBMS中的類似語句 |
|---|---|---|---|
| 等于 | {<key>:<value> } | db.mycol.find({"by":"tutorials point"}).pretty() | where by = 'tutorials point' |
| 小于 | {<key>:{$lt:<value>}} | db.mycol.find({"likes":{$lt:50}}).pretty() | where likes < 50 |
| 小于或等于 | {<key>:{$lte:<value>}} | db.mycol.find({"likes":{$lte:50}}).pretty() | where likes <= 50 |
| 大于 | {<key>:{$gt:<value>}} | db.mycol.find({"likes":{$gt:50}}).pretty() | where likes > 50 |
| 大于或等于 | {<key>:{$gte:<value>}} | db.mycol.find({"likes":{$gte:50}}).pretty() | where likes >= 50 |
| 不等于 | {<key>:{$ne:<value>}} | db.mycol.find({"likes":{$ne:50}}).pretty() | where likes != 50 |
MongoDB 中的 And 條件
語法格式
在 find() 方法中,如果傳入多個鍵,并用逗號( , )分隔它們,那么 MongoDB 會把它看成是 AND 條件。AND條件的基本語法格式為:
db.mycol.find({key1:value1, key2:value2}).pretty()
范例
下例將展示所有由 “tutorials point” 發(fā)表的標(biāo)題為 “MongoDB Overview” 的教程。
>db.mycol.find({"by":"tutorials point","title": "MongoDB Overview"}).pretty()
{
"_id": ObjectId(7df78ad8902c),
"title": "MongoDB Overview",
"description": "MongoDB is no sql database",
"by": "tutorials point",
"url": "http://www.tutorialspoint.com",
"tags": ["mongodb", "database", "NoSQL"],
"likes": "100"
}
對于上例這種情況,RDBMS 采用的 WHERE 子句將會是: where by='tutorials point' AND title='MongoDB Overview'。你可以在 find 子句中傳入任意的鍵值對。
MongoDB 中的 OR 條件
語法格式
若基于 OR 條件來查詢文檔,可以使用關(guān)鍵字$or。 OR 條件的基本語法格式為:
>db.mycol.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
范例
下例將展示所有由 “tutorials point” 發(fā)表的標(biāo)題為 “MongoDB Overview” 的教程。
> 格式:db.mycol.find({$or:[{},{}]})
>db.mycol.find({$or:[{"by":"tutorials point"},{"title": "MongoDB Overview"}]}).pretty()
{
"_id": ObjectId(7df78ad8902c),
"title": "MongoDB Overview",
"description": "MongoDB is no sql database",
"by": "tutorials point",
"url": "http://www.tutorialspoint.com",
"tags": ["mongodb", "database", "NoSQL"],
"likes": "100"
}
結(jié)合使用 AND 與 OR 條件
范例
下例所展示文檔的條件為:喜歡數(shù)大于 100,標(biāo)題是 “MongoDB Overview”,或者是由 “tutorials point”所發(fā)表的。響應(yīng)的 SQL WHERE 子句為: where likes>10 AND (by = 'tutorials point' OR title = 'MongoDB Overview')
> 格式:db.mycol.find({},$or:[{},{}])
>db.mycol.find({"likes": {$gt:10}, $or: [{"by": "tutorials point"},{"title": "MongoDB Overview"}]}).pretty()
{
"_id": ObjectId(7df78ad8902c),
"title": "MongoDB Overview",
"description": "MongoDB is no sql database",
"by": "tutorials point",
"url": "http://www.tutorialspoint.com",
"tags": ["mongodb", "database", "NoSQL"],
"likes": "100"
}
更新文檔
MongoDB 中的 update() 與 save() 方法都能用于更新集合中的文檔。 update() 方法更新已有文檔中的值,而 save() 方法則是用傳入該方法的文檔來替換已有文檔。
update()方法
update() 方法更新已有文檔中的值。
語法格式
update()方法基本格式如下:
db.COLLECTION_NAME.update(SELECTIOIN_CRITERIA, UPDATED_DATA)
范例
假如 mycol 集合中有下列數(shù)據(jù):
{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}
下面的例子將把文檔原標(biāo)題 'MongoDB Overview' 替換為新的標(biāo)題 '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":"Tutorials Point Overview"}
MongoDB 默認(rèn)只更新單個文檔,要想更新多個文檔,需要把參數(shù) multi 設(shè)為 true 。
>db.mycol.update({'title':'MongoDB Overview'},{$set:{'title':'New MongoDB Tutorial'}},{multi:true})
save() 方法
save()方法利用傳入該方法的文檔來替換已有文檔。
語法格式
save() 方法基本語法格式如下:
db.COLLECTION_NAME.save({_id:ObjectId(),NEW_DATA})
范例
下例更新 _id 為 '5983548781331adf45ec7' 的文檔。
>db.mycol.save(
{
"_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point New Topic", "by":"Tutorials Point"
}
)
>db.mycol.find()
{ "_id" : ObjectId(5983548781331adf45ec5), "title":"New MongoDB Tutorial"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point New Topic", "by":"Tutorials Point"}
刪除文檔
remove() 方法
MongoDB 利用 remove() 方法 清除集合中的文檔。它有 2 個可選參數(shù):
- deletion criteria:(可選)刪除文檔的標(biāo)準(zhǔn)。
- justOne:(可選)如果設(shè)為 true 或 1,則只刪除一個文檔。
語法格式
remove()方法的基本語法格式如下所示:
db.COLLECTION_NAME.remove(DELLETION_CRITTERIA)
范例
假如 mycol 集合中包含下列數(shù)據(jù):
{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}
下面我們將刪除其中所有標(biāo)題為 'MongoDB Overview' 的文檔。
>db.mycol.remove({'title':'MongoDB Overview'})
>db.mycol.find()
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}
只刪除一個文檔
如果有多個記錄,而你只想刪除第一條記錄,那么就設(shè)置 remove() 方法中的 justOne 參數(shù):
db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)
刪除所有文檔
如果沒有指定刪除標(biāo)準(zhǔn),則 MongoDB 會將集合中所有文檔都予以刪除。 這等同于 SQL 中的 truncate 命令。
>db.mycol.remove()
>db.mycol.find()
映射
在 MongoDB 中,映射(Projection)指的是只選擇文檔中的必要數(shù)據(jù),而非全部數(shù)據(jù)。如果文檔有 5 個字段,而你只需要顯示 3 個,則只需選擇 3 個字段即可。
find()方法
MongoDB 的查詢文檔曾介紹過find() 方法,不管是利用 AND 或 OR 條件來獲取想要的字段列表都是顯示一個文檔的所有字段。要想限制,可以利用 0 或 1 來設(shè)置字段列表。1 用于顯示字段,0 用于隱藏字段。
語法格式
帶有映射的 find() 方法的基本語法格式為:
db.COLLECTION_NAME.find({},{KEY:1})
范例
假如 mycol 集合擁有下列數(shù)據(jù):
{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}
下例將在查詢文檔時顯示文檔標(biāo)題。
>db.mycol.find({},{"title":1,"_id":0})
{"title":"MongoDB Overview"}
{"title":"NoSQL Overview"}
{"title":"Tutorials Point Overview"}
注意:在執(zhí)行 find() 方法時, _id 字段是一直顯示的。如果不想顯示該字段,則可以將其設(shè)為 0。
限制記錄
limit() 方法
要想限制 MongoDB 中的記錄,可以使用 limit()方法。limit() 方法接受一個數(shù)值類型的參數(shù),其值為想要顯示的文檔數(shù)。
語法格式
limit()方法的基本語法格式為:
db.COLLECTION_NAME.find().limit(NUMBER)
范例
假設(shè) mycol 集合擁有下列數(shù)據(jù):
{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}
下例將在查詢文檔時只顯示 2 個文檔。
>db.mycol.find({},{"title":1,_id:0}).limit(2)
{"title":"MongoDB Overview"}
{"title":"NoSQL Overview"}
如果未指定limit() 方法中的數(shù)值參數(shù),則將顯示該集合內(nèi)的所有文檔。
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() 方法中的默認(rèn)值為 0。
記錄排序
sort() 方法
MongoDB 中的文檔排序是通過 sort()方法來實現(xiàn)的。 sort() 方法可以通過一些參數(shù)來指定要進(jìn)行排序的字段,并使用 1 和 -1 來指定排序方式,其中 1 表示升序,而 -1 表示降序。
語法格式
sort() 方法基本格式為:
db.COLLECTION_NAME.find().sort({KEY:1})
范例
假設(shè)集合 myycol 包含下列數(shù)據(jù):
{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}
下面的范例將顯示按照降序排列標(biāo)題的文檔。
>db.mycol.find({},{"title":1,_id:0}).sort({"title":-1})
{"title":"Tutorials Point Overview"}
{"title":"NoSQL Overview"}
{"title":"MongoDB Overview"}
注意,如果不指定排序規(guī)則, sort() 方法將按照升序排列顯示文檔。
索引
索引能夠?qū)崿F(xiàn)高效地查詢。沒有索引,MongoDB 就必須掃描集合中的所有文檔,才能找到匹配查詢語句的文檔。這種掃描毫無效率可言,需要處理大量的數(shù)據(jù)。
索引是一種特殊的數(shù)據(jù)結(jié)構(gòu),將一小塊數(shù)據(jù)集保存為容易遍歷的形式。索引能夠存儲某種特殊字段或字段集的值,并按照索引指定的方式將字段值進(jìn)行排序。
ensureIndex() 方法
要想創(chuàng)建索引,需要使用 MongoDB 的 ensureIndex() 方法。
語法格式
ensureIndex()方法的基本語法格式為:
db.COLLECTION_NAME.ensureIndex({KEY:1})
這里的 key 是想創(chuàng)建索引的字段名稱,1 代表按升序排列字段值。-1 代表按降序排列。
范例
>db.mycol.ensureIndex({"title":1})
可以為 ensureIndex() 方法傳入多個字段,從而為多個字段創(chuàng)建索引。
>db.mycol.ensureIndex({"title":1,"description":-1})
ensureIndex() 方法也可以接受一些可選參數(shù),如下所示:
| 參數(shù) | 類型 | 描述 |
|---|---|---|
| background | 布爾值 | 在后臺構(gòu)建索引,從而不干擾數(shù)據(jù)庫的其他活動。取值為 true 時,代表在后臺構(gòu)建索引。默認(rèn)值為 false |
| unique | 布爾值 | 創(chuàng)建一個唯一的索引,從而當(dāng)索引鍵匹配了索引中一個已存在值時,集合不接受文檔的插入。取值為 true 代表創(chuàng)建唯一性索引。默認(rèn)值為 false 。 |
| name | 字符串 | 索引名稱。如果未指定,MongoDB 會結(jié)合索引字段名稱和排序序號,生成一個索引名稱。 |
| dropDups | 布爾值 | 在可能有重復(fù)的字段內(nèi)創(chuàng)建唯一性索引。ongoDB 只在某個鍵第一次出現(xiàn)時進(jìn)行索引,去除該鍵后續(xù)出現(xiàn)時的所有文檔。 |
| sparse | 布爾值 | 如果為 true,索引只引用帶有指定字段的文檔。這些索引占據(jù)的空間較小,但在一些情況下的表現(xiàn)也不同(特別是排序)。默認(rèn)值為 false 。 |
| expireAfterSeconds | 整型值 | 指定一個秒數(shù)值,作為 TTL 來控制 MongoDB 保持集合中文檔的時間。 |
| v | 索引版本 | 索引版本號。默認(rèn)的索引版本跟創(chuàng)建索引時運行的 MongoDB 版本號有關(guān)。 |
| weights | 文檔 | 數(shù)值,范圍從 1 到 99, 999。表示就字段相對于其他索引字段的重要性。 |
| default_language | 字符串 | 對文本索引而言,用于確定停止詞列表,以及詞干分析器(stemmer)與斷詞器(tokenizer)的規(guī)則。默認(rèn)值為 english。 |
| language_override | 字符串 | 對文本索引而言,指定了文檔所包含的字段名,該語言將覆蓋默認(rèn)語言。默認(rèn)值為 language。 |
聚合
聚合操作能夠處理數(shù)據(jù)記錄并返回計算結(jié)果。聚合操作能將多個文檔中的值組合起來,對成組數(shù)據(jù)執(zhí)行各種操作,返回單一的結(jié)果。它相當(dāng)于 SQL 中的 count(*) 組合 group by。
aggregate() 方法
對于 MongoDB 中的聚合操作,應(yīng)該使用 aggregate()方法。
語法格式
aggregate() 方法中的基本格式如下所示:
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
范例
假如某個集合包含下列數(shù)據(jù):
{
_id: ObjectId(7df78ad8902c)
title: 'MongoDB Overview',
description: 'MongoDB is no sql database',
by_user: 'tutorials point',
url: 'http://www.tutorialspoint.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
},
{
_id: ObjectId(7df78ad8902d)
title: 'NoSQL Overview',
description: 'No sql database is very fast',
by_user: 'tutorials point',
url: 'http://www.tutorialspoint.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
}
假如想從上述集合中,歸納出一個列表,以顯示每個用戶寫的教程數(shù)量,需要像下面這樣使用 aggregate() 方法:
> db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
{
"result" : [
{
"_id" : "tutorials point",
"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,就遞增之前的合計值。下面是聚合表達(dá)式列表。
| 表達(dá)式 | 描述 | 范例 |
|---|---|---|
$sum |
對集合中所有文檔的定義值進(jìn)行加和操作 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]) |
$avg |
對集合中所有文檔的定義值進(jìn)行平均值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]) |
$min |
計算集合中所有文檔的對應(yīng)值中的最小值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]) |
$max |
計算集合中所有文檔的對應(yīng)值中的最大值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) |
$push |
將值插入到一個結(jié)果文檔的數(shù)組中 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]) |
$addToSet |
將值插入到一個結(jié)果文檔的數(shù)組中,但不進(jìn)行復(fù)制 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]) |
$first |
根據(jù)成組方式,從源文檔中獲取第一個文檔。但只有對之前應(yīng)用過 $sort 管道操作符的結(jié)果才有意義。 |
db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}]) |
$last |
根據(jù)成組方式,從源文檔中獲取最后一個文檔。但只有對之前進(jìn)行過 $sort 管道操作符的結(jié)果才有意義。 |
db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}]) |
管道的概念
在 UNIX 命令 Shell 中,管道(pipeline)概念指的是能夠在一些輸入上執(zhí)行一個操作,然后將輸出結(jié)果用作下一個命令的輸入。MongoDB 的聚合架構(gòu)也支持這種概念。管道中有很多階段(stage),在每一階段中,管道操作符都會將一組文檔作為輸入,產(chǎn)生一個結(jié)果文檔(或者管道終點所得到的最終 JSON 格式的文檔),然后再將其用在下一階段。
聚合架構(gòu)中可能采取的管道操作符有:
- $project 用來選取集合中一些特定字段。
- $match 過濾操作。減少用作下一階段輸入的文檔的數(shù)量。
- $group 如上所述,執(zhí)行真正的聚合操作。
- $sort 對文檔進(jìn)行排序。
- $skip 在一組文檔中,跳過指定數(shù)量的文檔。
- $limit 將查看文檔的數(shù)目限制為從當(dāng)前位置處開始的指定數(shù)目。
- $unwind 解開使用數(shù)組的文檔。當(dāng)使用數(shù)組時,數(shù)據(jù)處于預(yù)連接狀態(tài),通過該操作,數(shù)據(jù)重新回歸為各個單獨的文檔的狀態(tài)。利用該階段性操作可增加下一階段性操作的文檔數(shù)量。
創(chuàng)建備份
數(shù)據(jù)庫備份
為了在 MongoDB 中創(chuàng)建數(shù)據(jù)庫備份,需要使用 mongodump 命令。該命令會將服務(wù)器上的所有數(shù)據(jù)都轉(zhuǎn)儲到 dump 目錄中。你可以使用很多選項來限制轉(zhuǎn)儲的數(shù)據(jù)量,或者創(chuàng)建遠(yuǎn)程服務(wù)器備份。
語法格式
mongodump 命令的基本語法格式為:
mongodump
范例
開啟 mongod 服務(wù)器。假設(shè) mongod 服務(wù)器運行在 localhost 上,端口為 27017。在命令行上輸入命令,在 MongoDB 實例的 bin 目錄下輸入 mongodump 命令。
假設(shè) mycol 集合包含如下數(shù)據(jù):
>mongodump
上述命令會連接在 127.0.0.1 運行的服務(wù)器(端口為 27017),將所有數(shù)據(jù)備份到 /bin/dump 上。命令輸出結(jié)果如下圖所示:

mongodump 命令其實包含很多選項。
| 語法格式 | 描述 | 范例 |
|---|---|---|
mongodump --host HOST_NAME --port PORT_NUMBER |
該命令將指定 mongod 實例上的所有數(shù)據(jù)庫都進(jìn)行了備份 | mongodump --host tutorialspoint.com --port 27017 |
mongodump --dbpath DB_PATH --out BACKUP_DIRECTORY |
該命令將指定數(shù)據(jù)庫內(nèi)容存放目錄和備份輸出目錄 | mongodump --dbpath /data/db/ --out /data/backup/ |
mongodump --collection COLLECTION --db DB_NAME |
該命令只備份那些指定路徑上的指定數(shù)據(jù)庫 | mongodump --collection mycol --db test |
恢復(fù)備份
重新恢復(fù)數(shù)據(jù)
恢復(fù)備份數(shù)據(jù)使用 mongorestore 命令,該命令將備份目錄中的所有數(shù)據(jù)給予恢復(fù)。
語法格式
mongorestore 命令的基本語法格式為:
> mongorestore
范例
該命令輸入結(jié)果如下圖所示:
