MongoDB 入門極簡教程

安裝 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é)果如下圖所示:

創(chuàng)建備份

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é)果如下圖所示:

恢復(fù)備份
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容