MongoDB 入門極簡(jiǎn)教程

安裝 MongoDB

MongoDB 幫助

要想獲取命令列表,在 mongodb 客戶端中輸入 db.help()

> db.help()

MongoDB 統(tǒng)計(jì)信息

要想獲取 MongoDB 服務(wù)器的統(tǒng)計(jì)信息肆捕,在 mongodb 客戶端中輸入 db.stat()

> db.stats()

創(chuàng)建數(shù)據(jù)庫(kù)

use 命令

MongoDB 用 use + 數(shù)據(jù)庫(kù)名稱 的方式來創(chuàng)建數(shù)據(jù)庫(kù)。 use 會(huì)創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù),如果該數(shù)據(jù)庫(kù)存在额衙,則返回這個(gè)數(shù)據(jù)庫(kù)。

語(yǔ)法格式

use 語(yǔ)句的基本格式如下:
use DATABASE_NAME

范例

創(chuàng)建一個(gè)名為mydb的數(shù)據(jù)庫(kù)怕吴,使用 use 語(yǔ)句如下:

>use mydb
switched to db mydb
# 使用命令 db 檢查當(dāng)前選定的數(shù)據(jù)庫(kù)窍侧。
>db
mydb

使用命令 show dbs 來檢查數(shù)據(jù)庫(kù)列表。

>show dbs
local 0.78125GB
test 0.23012GB

剛創(chuàng)建的數(shù)據(jù)庫(kù)(mydb)沒有出現(xiàn)在列表中转绷。為了讓數(shù)據(jù)庫(kù)顯示出來伟件,至少應(yīng)該插入一個(gè)文檔。

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

在 MongoDB 中议经,默認(rèn)的數(shù)據(jù)庫(kù)是 test斧账,如果你沒有創(chuàng)建任何數(shù)據(jù)庫(kù)谴返,那么集合就會(huì)保存在 test 數(shù)據(jù)庫(kù)中。

刪除數(shù)據(jù)庫(kù)

dropDatabase() 方法

MongoDB 的 dropDatabase()命令用于刪除已有數(shù)據(jù)庫(kù)咧织。

語(yǔ)法格式

dropDatabase() 命令的語(yǔ)法格式如下:
db.dropDatabase()
它將刪除選定的數(shù)據(jù)庫(kù)嗓袱。如果沒有選定要?jiǎng)h除的數(shù)據(jù)庫(kù),則它會(huì)將默認(rèn)的 test 數(shù)據(jù)庫(kù)刪除习绢。

范例

首先使用 show dbs 來列出已有的數(shù)據(jù)庫(kù)渠抹。

>show dbs
local 0.78125GB
mydb 0.23012GB
test 0.23012GB

如果想刪除新數(shù)據(jù)庫(kù) <mydb> ,如下面這樣使用 dropDatabase()方法:

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

創(chuàng)建集合

createCollection() 方法

在 MongoDB 中闪萄,創(chuàng)建集合采用 db.createCollection(name, options)方法梧却。

語(yǔ)法格式

createCollection() 方法的基本格式如下:
db.createCollection(name, options)
在該命令中, name 是所要?jiǎng)?chuàng)建的集合名稱败去。 options 是一個(gè)用來指定集合配置的文檔篮幢。

參數(shù) 類型 描述
name 字符串 所要?jiǎng)?chuàng)建的集合名稱
options 文檔 可選。指定有關(guān)內(nèi)存大小及索引的選項(xiàng)

參數(shù) options 是可選的为迈,所以你必須指定的只有集合名稱三椿。下表列出了所有可用選項(xiàng):

字段 類型 描述
capped 布爾 (可選)如果為 true,則創(chuàng)建固定集合葫辐。固定集合是指有著固定大小的集合搜锰,當(dāng)達(dá)到最大值時(shí),它會(huì)自動(dòng)覆蓋最早的文檔耿战。當(dāng)該值為 true 時(shí)蛋叼,必須指定 size 參數(shù)。
autoIndexID 布爾 (可選)如為 true剂陡,自動(dòng)在 _id 字段創(chuàng)建索引狈涮。默認(rèn)為 false。
size 數(shù)值 (可選)為固定集合指定一個(gè)最大值(以字節(jié)計(jì))鸭栖。如果 capped 為 true歌馍,也需要指定該字段。
max 數(shù)值 (可選)指定固定集合中包含文檔的最大數(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

下面是帶有幾個(gè)關(guān)鍵參數(shù)的 createCollection()的用法:

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

在 MongoDB 中,你不需要?jiǎng)?chuàng)建集合飞几。當(dāng)你插入一些文檔時(shí)砚哆,MongoDB 會(huì)自動(dòng)創(chuàng)建集合。

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

刪除集合

drop() 方法

MongoDB 利用 db.collection.drop()來刪除數(shù)據(jù)庫(kù)中的集合屑墨。

語(yǔ)法格式

drop() 命令的基本格式如下:
db.COLLECTION_NAME.drop()

范例

首先檢查在數(shù)據(jù)庫(kù) 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:字符串关炼。存儲(chǔ)數(shù)據(jù)常用的數(shù)據(jù)類型程腹。在 MongoDB 中匣吊,UTF-8 編碼的字符串才是合法的。
  • Integer:整型數(shù)值寸潦。用于存儲(chǔ)數(shù)值色鸳。根據(jù)你所采用的服務(wù)器,可分為 32 位或 64 位见转。
  • Boolean:布爾值命雀。用于存儲(chǔ)布爾值(真/假)。
  • Double:雙精度浮點(diǎn)值斩箫。用于存儲(chǔ)浮點(diǎn)值吏砂。
  • Min/Max keys:將一個(gè)值與 BSON(二進(jìn)制的 JSON)元素的最低值和最高值相對(duì)比。
  • Arrays:用于將數(shù)組或列表或多個(gè)值存儲(chǔ)為一個(gè)鍵乘客。
  • Timestamp:時(shí)間戳狐血。記錄文檔修改或添加的具體時(shí)間。
  • Object:用于內(nèi)嵌文檔易核。
  • Null:用于創(chuàng)建空值匈织。
  • Symbol:符號(hào)。該數(shù)據(jù)類型基本上等同于字符串類型牡直,但不同的是缀匕,它一般用于采用特殊符號(hào)類型的語(yǔ)言。
  • Date:日期時(shí)間碰逸。用 UNIX 時(shí)間格式來存儲(chǔ)當(dāng)前日期或時(shí)間乡小。你可以指定自己的日期時(shí)間:創(chuàng)建 Date 對(duì)
    象,傳入年月日信息饵史。
  • Object ID:對(duì)象 ID劲件。用于創(chuàng)建文檔的 ID。
  • Binary Data:二進(jìn)制數(shù)據(jù)约急。用于存儲(chǔ)二進(jìn)制數(shù)據(jù)零远。
  • Code:代碼類型。用于在文檔中存儲(chǔ) JavaScript 代碼厌蔽。
  • Regular expression:正則表達(dá)式類型牵辣。用于存儲(chǔ)正則表達(dá)式。

插入文檔

insert() 方法

要想將數(shù)據(jù)插入 MongoDB 集合中奴饮,需要使用insert()save()方法纬向。
insert()save()方法d的區(qū)別是當(dāng)主鍵重復(fù)時(shí)择浊,insert()會(huì)報(bào)錯(cuò), save()會(huì)覆蓋原有內(nèi)容逾条。

語(yǔ)法格式

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ù)庫(kù)中不存在該集合,那么 MongoDB 會(huì)創(chuàng)建該集合师脂,并向其中插入文檔担孔。
在插入的文檔中,如果我們沒有指定 _id 參數(shù)吃警,那么 MongoDB 會(huì)自動(dòng)為文檔指定一個(gè)唯一的 ID糕篇。
為了,你可以將用 insert() 方法傳入一個(gè)文檔數(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 墩崩,那么它會(huì)覆蓋掉含有 save() 方法中指定的 _id 的文檔的全部數(shù)據(jù)。

查詢文檔

find() 方法

要想查詢 MongoDB 集合中的數(shù)據(jù)侯勉,使用 find() 方法鹦筹。

語(yǔ)法格式

find() 方法的基本格式為:
db.COLLECTION_NAME.find()
find()方法會(huì)以非結(jié)構(gòu)化的方式來顯示所有文檔。
pretty() 方法用格式化方式顯示結(jié)果壳鹤,使用的是 pretty() 方法盛龄。
語(yǔ)法格式
>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() 方法之外,還有一個(gè) findOne() 方法芳誓,它只返回一個(gè)文檔余舶。

MongoDB 中類似于 WHERE 子句的語(yǔ)句

如果想要基于一些條件來查詢文檔,可以使用下列操作锹淌。

操作 格式 范例 RDBMS中的類似語(yǔ)句
等于 {<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 條件

語(yǔ)法格式

find() 方法中匿值,如果傳入多個(gè)鍵,并用逗號(hào)( , )分隔它們赂摆,那么 MongoDB 會(huì)把它看成是 AND 條件挟憔。AND條件的基本語(yǔ)法格式為:
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"
}

對(duì)于上例這種情況烟号,RDBMS 采用的 WHERE 子句將會(huì)是: where by='tutorials point' AND title='MongoDB Overview'绊谭。你可以在 find 子句中傳入任意的鍵值對(duì)。

MongoDB 中的 OR 條件

語(yǔ)法格式

若基于 OR 條件來查詢文檔汪拥,可以使用關(guān)鍵字$or达传。 OR 條件的基本語(yǔ)法格式為:

>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() 方法更新已有文檔中的值。

語(yǔ)法格式

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)只更新單個(gè)文檔邓厕,要想更新多個(gè)文檔,需要把參數(shù) multi 設(shè)為 true 岛蚤。

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

save() 方法

save()方法利用傳入該方法的文檔來替換已有文檔邑狸。
語(yǔ)法格式
save() 方法基本語(yǔ)法格式如下:
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 個(gè)可選參數(shù):

  • deletion criteria:(可選)刪除文檔的標(biāo)準(zhǔn)。
  • justOne:(可選)如果設(shè)為 true 或 1赚哗,則只刪除一個(gè)文檔她紫。

語(yǔ)法格式

remove()方法的基本語(yǔ)法格式如下所示:
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"}

只刪除一個(gè)文檔

如果有多個(gè)記錄屿储,而你只想刪除第一條記錄贿讹,那么就設(shè)置 remove() 方法中的 justOne 參數(shù):
db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)

刪除所有文檔

如果沒有指定刪除標(biāo)準(zhǔn),則 MongoDB 會(huì)將集合中所有文檔都予以刪除够掠。 這等同于 SQL 中的 truncate 命令民褂。

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

映射

在 MongoDB 中,映射(Projection)指的是只選擇文檔中的必要數(shù)據(jù)疯潭,而非全部數(shù)據(jù)赊堪。如果文檔有 5 個(gè)字段,而你只需要顯示 3 個(gè)竖哩,則只需選擇 3 個(gè)字段即可哭廉。

find()方法

MongoDB 的查詢文檔曾介紹過find() 方法,不管是利用 AND 或 OR 條件來獲取想要的字段列表都是顯示一個(gè)文檔的所有字段相叁。要想限制遵绰,可以利用 0 或 1 來設(shè)置字段列表。1 用于顯示字段增淹,0 用于隱藏字段椿访。

語(yǔ)法格式

帶有映射的 find() 方法的基本語(yǔ)法格式為:
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"}

下例將在查詢文檔時(shí)顯示文檔標(biāo)題。

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

注意:在執(zhí)行 find() 方法時(shí)虑润, _id 字段是一直顯示的成玫。如果不想顯示該字段,則可以將其設(shè)為 0。

限制記錄

limit() 方法

要想限制 MongoDB 中的記錄梁剔,可以使用 limit()方法虽画。limit() 方法接受一個(gè)數(shù)值類型的參數(shù),其值為想要顯示的文檔數(shù)荣病。

語(yǔ)法格式

limit()方法的基本語(yǔ)法格式為:
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"}

下例將在查詢文檔時(shí)只顯示 2 個(gè)文檔码撰。

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

如果未指定limit() 方法中的數(shù)值參數(shù),則將顯示該集合內(nèi)的所有文檔个盆。

skip() 方法

語(yǔ)法格式

skip()方法基本語(yǔ)法格式為:
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

范例

下例將只顯示第二個(gè)文檔:

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

注意: skip() 方法中的默認(rèn)值為 0脖岛。

記錄排序

sort() 方法

MongoDB 中的文檔排序是通過 sort()方法來實(shí)現(xiàn)的。 sort() 方法可以通過一些參數(shù)來指定要進(jìn)行排序的字段颊亮,并使用 1 和 -1 來指定排序方式柴梆,其中 1 表示升序,而 -1 表示降序终惑。

語(yǔ)法格式

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 就必須掃描集合中的所有文檔溜宽,才能找到匹配查詢語(yǔ)句的文檔。這種掃描毫無效率可言质帅,需要處理大量的數(shù)據(jù)适揉。
索引是一種特殊的數(shù)據(jù)結(jié)構(gòu),將一小塊數(shù)據(jù)集保存為容易遍歷的形式煤惩。索引能夠存儲(chǔ)某種特殊字段或字段集的值嫉嘀,并按照索引指定的方式將字段值進(jìn)行排序。

ensureIndex() 方法

要想創(chuàng)建索引盟庞,需要使用 MongoDB 的 ensureIndex() 方法吃沪。

語(yǔ)法格式

ensureIndex()方法的基本語(yǔ)法格式為:
db.COLLECTION_NAME.ensureIndex({KEY:1})
這里的 key 是想創(chuàng)建索引的字段名稱,1 代表按升序排列字段值什猖。-1 代表按降序排列票彪。

范例

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

可以為 ensureIndex() 方法傳入多個(gè)字段,從而為多個(gè)字段創(chuàng)建索引不狮。

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

ensureIndex() 方法也可以接受一些可選參數(shù)降铸,如下所示:

參數(shù) 類型 描述
background 布爾值 在后臺(tái)構(gòu)建索引,從而不干擾數(shù)據(jù)庫(kù)的其他活動(dòng)摇零。取值為 true 時(shí)发乔,代表在后臺(tái)構(gòu)建索引挺狰。默認(rèn)值為 false
unique 布爾值 創(chuàng)建一個(gè)唯一的索引编丘,從而當(dāng)索引鍵匹配了索引中一個(gè)已存在值時(shí),集合不接受文檔的插入登渣。取值為 true 代表創(chuàng)建唯一性索引。默認(rèn)值為 false 毡泻。
name 字符串 索引名稱胜茧。如果未指定,MongoDB 會(huì)結(jié)合索引字段名稱和排序序號(hào)仇味,生成一個(gè)索引名稱呻顽。
dropDups 布爾值 在可能有重復(fù)的字段內(nèi)創(chuàng)建唯一性索引。ongoDB 只在某個(gè)鍵第一次出現(xiàn)時(shí)進(jìn)行索引丹墨,去除該鍵后續(xù)出現(xiàn)時(shí)的所有文檔廊遍。
sparse 布爾值 如果為 true,索引只引用帶有指定字段的文檔贩挣。這些索引占據(jù)的空間較小喉前,但在一些情況下的表現(xiàn)也不同(特別是排序)。默認(rèn)值為 false 揽惹。
expireAfterSeconds 整型值 指定一個(gè)秒數(shù)值被饿,作為 TTL 來控制 MongoDB 保持集合中文檔的時(shí)間四康。
v 索引版本 索引版本號(hào)搪搏。默認(rèn)的索引版本跟創(chuàng)建索引時(shí)運(yùn)行的 MongoDB 版本號(hào)有關(guān)。
weights 文檔 數(shù)值闪金,范圍從 1 到 99, 999疯溺。表示就字段相對(duì)于其他索引字段的重要性。
default_language 字符串 對(duì)文本索引而言哎垦,用于確定停止詞列表囱嫩,以及詞干分析器(stemmer)與斷詞器(tokenizer)的規(guī)則。默認(rèn)值為 english漏设。
language_override 字符串 對(duì)文本索引而言墨闲,指定了文檔所包含的字段名,該語(yǔ)言將覆蓋默認(rèn)語(yǔ)言郑口。默認(rèn)值為 language鸳碧。

聚合

聚合操作能夠處理數(shù)據(jù)記錄并返回計(jì)算結(jié)果。聚合操作能將多個(gè)文檔中的值組合起來犬性,對(duì)成組數(shù)據(jù)執(zhí)行各種操作瞻离,返回單一的結(jié)果。它相當(dāng)于 SQL 中的 count(*) 組合 group by乒裆。

aggregate() 方法

對(duì)于 MongoDB 中的聚合操作套利,應(yīng)該使用 aggregate()方法。

語(yǔ)法格式

aggregate() 方法中的基本格式如下所示:
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

范例

假如某個(gè)集合包含下列數(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
}

假如想從上述集合中,歸納出一個(gè)列表肉迫,以顯示每個(gè)用戶寫的教程數(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,就遞增之前的合計(jì)值格侯。下面是聚合表達(dá)式列表鼻听。

表達(dá)式 描述 范例
$sum 對(duì)集合中所有文檔的定義值進(jìn)行加和操作 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])
$avg 對(duì)集合中所有文檔的定義值進(jìn)行平均值 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])
$min 計(jì)算集合中所有文檔的對(duì)應(yīng)值中的最小值 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])
$max 計(jì)算集合中所有文檔的對(duì)應(yīng)值中的最大值 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])
$push 將值插入到一個(gè)結(jié)果文檔的數(shù)組中 db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])
$addToSet 將值插入到一個(gè)結(jié)果文檔的數(shù)組中,但不進(jìn)行復(fù)制 db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])
$first 根據(jù)成組方式联四,從源文檔中獲取第一個(gè)文檔撑碴。但只有對(duì)之前應(yīng)用過 $sort 管道操作符的結(jié)果才有意義。 db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])
$last 根據(jù)成組方式朝墩,從源文檔中獲取最后一個(gè)文檔醉拓。但只有對(duì)之前進(jìn)行過 $sort 管道操作符的結(jié)果才有意義。 db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])

管道的概念

在 UNIX 命令 Shell 中收苏,管道(pipeline)概念指的是能夠在一些輸入上執(zhí)行一個(gè)操作亿卤,然后將輸出結(jié)果用作下一個(gè)命令的輸入。MongoDB 的聚合架構(gòu)也支持這種概念鹿霸。管道中有很多階段(stage)排吴,在每一階段中,管道操作符都會(huì)將一組文檔作為輸入懦鼠,產(chǎn)生一個(gè)結(jié)果文檔(或者管道終點(diǎn)所得到的最終 JSON 格式的文檔)钻哩,然后再將其用在下一階段。
聚合架構(gòu)中可能采取的管道操作符有:

  • $project 用來選取集合中一些特定字段肛冶。
  • $match 過濾操作街氢。減少用作下一階段輸入的文檔的數(shù)量。
  • $group 如上所述睦袖,執(zhí)行真正的聚合操作珊肃。
  • $sort 對(duì)文檔進(jìn)行排序。
  • $skip 在一組文檔中馅笙,跳過指定數(shù)量的文檔伦乔。
  • $limit 將查看文檔的數(shù)目限制為從當(dāng)前位置處開始的指定數(shù)目。
  • $unwind 解開使用數(shù)組的文檔延蟹。當(dāng)使用數(shù)組時(shí)评矩,數(shù)據(jù)處于預(yù)連接狀態(tài),通過該操作阱飘,數(shù)據(jù)重新回歸為各個(gè)單獨(dú)的文檔的狀態(tài)斥杜。利用該階段性操作可增加下一階段性操作的文檔數(shù)量虱颗。

創(chuàng)建備份

數(shù)據(jù)庫(kù)備份

為了在 MongoDB 中創(chuàng)建數(shù)據(jù)庫(kù)備份,需要使用 mongodump 命令蔗喂。該命令會(huì)將服務(wù)器上的所有數(shù)據(jù)都轉(zhuǎn)儲(chǔ)到 dump 目錄中忘渔。你可以使用很多選項(xiàng)來限制轉(zhuǎn)儲(chǔ)的數(shù)據(jù)量,或者創(chuàng)建遠(yuǎn)程服務(wù)器備份缰儿。

語(yǔ)法格式

mongodump 命令的基本語(yǔ)法格式為:
mongodump

范例

開啟 mongod 服務(wù)器畦粮。假設(shè) mongod 服務(wù)器運(yùn)行在 localhost 上,端口為 27017乖阵。在命令行上輸入命令宣赔,在 MongoDB 實(shí)例的 bin 目錄下輸入 mongodump 命令。
假設(shè) mycol 集合包含如下數(shù)據(jù):
>mongodump
上述命令會(huì)連接在 127.0.0.1 運(yùn)行的服務(wù)器(端口為 27017)瞪浸,將所有數(shù)據(jù)備份到 /bin/dump 上儒将。命令輸出結(jié)果如下圖所示:

創(chuàng)建備份

mongodump 命令其實(shí)包含很多選項(xiàng)。

語(yǔ)法格式 描述 范例
mongodump --host HOST_NAME --port PORT_NUMBER 該命令將指定 mongod 實(shí)例上的所有數(shù)據(jù)庫(kù)都進(jìn)行了備份 mongodump --host tutorialspoint.com --port 27017
mongodump --dbpath DB_PATH --out BACKUP_DIRECTORY 該命令將指定數(shù)據(jù)庫(kù)內(nèi)容存放目錄和備份輸出目錄 mongodump --dbpath /data/db/ --out /data/backup/
mongodump --collection COLLECTION --db DB_NAME 該命令只備份那些指定路徑上的指定數(shù)據(jù)庫(kù) mongodump --collection mycol --db test

恢復(fù)備份

重新恢復(fù)數(shù)據(jù)

恢復(fù)備份數(shù)據(jù)使用 mongorestore 命令对蒲,該命令將備份目錄中的所有數(shù)據(jù)給予恢復(fù)钩蚊。

語(yǔ)法格式

mongorestore 命令的基本語(yǔ)法格式為:
> mongorestore

范例

該命令輸入結(jié)果如下圖所示:

恢復(fù)備份
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蹈矮,隨后出現(xiàn)的幾起案子砰逻,更是在濱河造成了極大的恐慌,老刑警劉巖泛鸟,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝠咆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡谈况,警方通過查閱死者的電腦和手機(jī)勺美,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碑韵,“玉大人,你說我怎么就攤上這事缎脾∽N牛” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵遗菠,是天一觀的道長(zhǎng)联喘。 經(jīng)常有香客問我,道長(zhǎng)辙纬,這世上最難降的妖魔是什么豁遭? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮贺拣,結(jié)果婚禮上蓖谢,老公的妹妹穿的比我還像新娘捂蕴。我一直安慰自己,他們只是感情好闪幽,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布啥辨。 她就那樣靜靜地躺著,像睡著了一般盯腌。 火紅的嫁衣襯著肌膚如雪溉知。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天腕够,我揣著相機(jī)與錄音级乍,去河邊找鬼。 笑死帚湘,一個(gè)胖子當(dāng)著我的面吹牛卡者,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播客们,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼崇决,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了底挫?” 一聲冷哼從身側(cè)響起恒傻,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎建邓,沒想到半個(gè)月后盈厘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡官边,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年沸手,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片注簿。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡契吉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出诡渴,到底是詐尸還是另有隱情捐晶,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布妄辩,位于F島的核電站惑灵,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏眼耀。R本人自食惡果不足惜英支,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哮伟。 院中可真熱鬧干花,春花似錦妄帘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至修赞,卻和暖如春婶恼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背柏副。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國(guó)打工勾邦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人割择。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓眷篇,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親荔泳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蕉饼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容