成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

簡明 MongoDB 入門教程

trilever / 1722人閱讀

摘要:在配置的時(shí)候使用絕對路徑替代相對路徑,有利于在排查故障時(shí)查找進(jìn)程啟動的目錄。在添加授權(quán)用戶和開啟認(rèn)證后,這些警告會自動消失。投影文檔中字段為或真值表示包含,或假值表示排除,可以設(shè)置多個(gè)字段為或,但不能混合使用。

MongoDB 是免費(fèi)開源的跨平臺 NoSQL 數(shù)據(jù)庫,命名源于英文單詞 humongous,意思是「巨大無比」,可見開發(fā)組對 MongoDB 的定位。與關(guān)系型數(shù)據(jù)庫不同,MongoDB 的數(shù)據(jù)以類似于 JSON 格式的二進(jìn)制文檔存儲:

{
    name: "Angeladady",
    age: 18,
    hobbies: ["Steam", "Guitar"]
}

文檔型的數(shù)據(jù)存儲方式有幾個(gè)重要好處:文檔的數(shù)據(jù)類型可以對應(yīng)到語言的數(shù)據(jù)類型,如數(shù)組類型(Array)和對象類型(Object);文檔可以嵌套,有時(shí)關(guān)系型數(shù)據(jù)庫涉及幾個(gè)表的操作,在 MongoDB 中一次就能完成,可以減少昂貴的連接花銷;文檔不對數(shù)據(jù)結(jié)構(gòu)加以限制,不同的數(shù)據(jù)結(jié)構(gòu)可以存儲在同一張表。

MongoDB 的文檔數(shù)據(jù)模型和索引系統(tǒng)能有效提升數(shù)據(jù)庫性能;復(fù)制集功能提供數(shù)據(jù)冗余,自動化容災(zāi)容錯,提升數(shù)據(jù)庫可用性;分片技術(shù)能夠分散單服務(wù)器的讀寫壓力,提高并發(fā)能力,提升數(shù)據(jù)庫的可拓展性。MongoDB 高性能,高可用性、可擴(kuò)展性等特點(diǎn),使其至 2009 年發(fā)布以來,逐漸被認(rèn)可,并被越來越多的用于生產(chǎn)環(huán)境中。AWS、GCP、阿里云等云平臺都提供了十分便捷的 MongoDB 云服務(wù)。

開啟 MongoDB 之旅

第一步,安裝 MongoDB。到官網(wǎng)下載壓縮包或安裝包,解壓或安裝后,可以把 bin 目錄添加到環(huán)境變量,方便后續(xù)命令的執(zhí)行。在開始階段,要用到 mongo 和 mongod 兩個(gè)命令。文章示例以 Linux 為標(biāo)準(zhǔn)。

啟動實(shí)例

第二步,通過 mongod 命令啟動實(shí)例。啟動之前,新建一個(gè)目錄來存放 mongoDB 的數(shù)據(jù)和日志:

mkdir mongoDB_example
cd mongoDB_example
mkdir bin data conf log
touch log/mongodb.log

上面的命令創(chuàng)建了四個(gè)目錄:

bin 如果不打算把 mongodb 的命令放到環(huán)境變量,可以將常用命令復(fù)制到 bin 目錄,方便調(diào)用,如 mongo 和 mongod。也可以把編寫的腳本,如副本集的啟動腳本,放在 bin 目錄里

data 用來存放數(shù)據(jù)

log 用來存放日志文件

conf 用來存放配置文件

在項(xiàng)目目錄中,使用 mongod 命令來啟動 mongoDB 進(jìn)程:

mongod --fork --port 12345 --dbpath datadb  --logpath log/mongodb.log

上面命令中選項(xiàng)的意義:

port 指定端口

dbpath 指定數(shù)據(jù)存放路徑

logpath 指定日志存放路徑

fork 后臺運(yùn)行(退出 shell 后進(jìn)程不會被中斷了)

啟動順利的話,就可以輸入ps aux | grep mongod,查看到啟動的 mongod 實(shí)例。如果啟動沒有成功,最好先檢查下路徑設(shè)置和端口占用。

配置文件啟動實(shí)例

相比設(shè)定選項(xiàng)來啟動實(shí)例,通過配置文件啟動更具有可維護(hù)性。在 conf 目錄下新建一個(gè)配置文件:

vi conf/mongodb.conf

配置文件使用的格式。接下來,把剛才的啟動配置輸入到配置文件中:

port = 12345
dbpath = data
logpath = log/mongodb.log
fork = true

啟動之前別忘了先殺掉之前啟動的實(shí)例kill -2 ,然后再重新啟動 mongoDB:

mongod -f conf/mongodb.conf

在沒有指定接口時(shí),默認(rèn)啟動在 27017 端口。在配置的時(shí)候使用絕對路徑替代相對路徑,有利于在排查故障時(shí)查找 mongoDB 進(jìn)程啟動的目錄。

連接實(shí)例

第三步,通過 mongo 命令來連接 mongoDB 實(shí)例:

mongo [options] [db address] [file names]

之前啟動實(shí)例的是在本地 12345 端口,安全模式未被開啟,所以不需要輸入用戶名和密碼即可直接連接:

mongo 127.0.0.1:12345

或者通過--host--port選項(xiàng)指定主機(jī)和端口。一切順利的話,就進(jìn)入了 mongoDB shell,shell 會報(bào)出一連串權(quán)限警告,不過不用擔(dān)心,這并不會影響之后的操作。在添加授權(quán)用戶和開啟認(rèn)證后,這些警告會自動消失。

數(shù)據(jù)庫 CRUD 操作

在進(jìn)行增查改刪操作之前,先了解下常用的 shell 操作:

db 顯示當(dāng)前所在數(shù)據(jù)庫,默認(rèn)為 test

show dbs 列出可用數(shù)據(jù)庫

show tables show collections 列出數(shù)據(jù)庫中可用集合

use 用于切換數(shù)據(jù)庫

mongoDB 預(yù)設(shè)有兩個(gè)數(shù)據(jù)庫,admin 和 local,admin 用來存放系統(tǒng)數(shù)據(jù),local 用來存放該實(shí)例數(shù)據(jù),在副本集中,一個(gè)實(shí)例的 local 數(shù)據(jù)庫對于其它實(shí)例是不可見的。使用 use 命令切換數(shù)據(jù)庫:

> use admin
> use local
> use newDatabase

可以 use 一個(gè)不存在的數(shù)據(jù)庫,當(dāng)你存入新數(shù)據(jù)時(shí),mongoDB 會創(chuàng)建這個(gè)數(shù)據(jù)庫:

> use newDatabase
> db.newCollection.insert({x:1})
WriteResult({ "nInserted" : 1 })

以上命令向數(shù)據(jù)庫中插入一個(gè)文檔,返回 1 表示插入成功,mongoDB 自動創(chuàng)建 newCollection 集合和數(shù)據(jù)庫 newDatabase。下面將創(chuàng)建一個(gè) drivers 集合,進(jìn)行增查改刪操作。

創(chuàng)建(Create)

MongoDB 提供 insert 方法創(chuàng)建新文檔:

db.collection.inserOne() 插入單個(gè)文檔
WriteResult({ "nInserted" : 1 })

db.collection.inserMany() 插入多個(gè)文檔

db.collection.insert() 插入單條或多條文檔

這里以 insert 方法為例:

> db.drivers.insert({name:"Chen1fa",age:18})
> db.drivers.insert({name:"Xiaose",age:35})
> db.drivers.insert({_id:91,name:"Sun1feng",age:34})

要注意,age:18age:"18"是不一樣的,前者插入的是數(shù)值,后者插入的是字符串。插入新文檔如果未指定 _id,mongoDB 會自動為插入的文檔添加 _id 字段。使用 db.dirvers.find() 命令即可看到剛剛插入的文檔:

> db.dirvers.find()
{ "_id" : ObjectId("598964bd56b8c69ae1e5f36a"), "name" : "Chen1fa", "age" : 18 }
{ "_id" : ObjectId("598964d456b8c69ae1e5f36b"), "name" : "Xiaose", "age" : 35 }
{ "_id" : 91, "name" : "Sun1feng", "age" : 34 }
查找(Read)

MongoDB 提供 find 方法查找文檔,第一個(gè)參數(shù)為查詢條件:

> db.drivers.find() #查找所有文檔
{ "_id" : ObjectId("598964bd56b8c69ae1e5f36a"), "name" : "Chen1fa", "age" : 18 }
{ "_id" : ObjectId("598964d456b8c69ae1e5f36b"), "name" : "Xiaose", "age" : 35 }
{ "_id" : 91, "name" : "Sun1feng", "age" : 34 }

> db.drivers.find({name: "Xiaose"}) #查找 name 為 Xiaose 的文檔
{ "_id" : ObjectId("598964d456b8c69ae1e5f36b"), "name" : "Xiaose", "age" : 35 }

> db.drivers.find({age:{$gt:20}}) #查找 age 大于 20 的文檔
{ "_id" : ObjectId("598964d456b8c69ae1e5f36b"), "name" : "Xiaose", "age" : 35 }
{ "_id" : 91, "name" : "Sun1feng", "age" : 34 }

上述代碼中的$gt對應(yīng)于大于號>的轉(zhuǎn)義。第二個(gè)參數(shù)可以傳入投影(projection,投影儀中,白色光源通過分光鏡、液晶板、投影鏡頭的光學(xué)變換后,投射到反射面上,顯示出了彩色圖像)文檔映射數(shù)據(jù):

> db.drivers.find({age:{$gt:20}},{name:1})
{ "_id" : ObjectId("598964d456b8c69ae1e5f36b"), "name" : "Xiaose" }
{ "_id" : 91, "name" : "Sun1feng" }

上述命令將查找 age 大于 20 的文檔,返回 name 字段,排除其它字段。投影文檔中字段為 1 或真值表示包含,0 或假值表示排除,可以設(shè)置多個(gè)字段為 1 或 0,但不能混合使用。

除此之外,還可以通過 count、skip、limit 等指針(Cursor)方法,改變文檔查詢的執(zhí)行方式:

> db.drivers.find().count() #統(tǒng)計(jì)查詢文檔數(shù)目
3
> db.drivers.find().skip(1).limit(10).sort({age:1})
{ "_id" : 91, "name" : "Sun1feng", "age" : 34 }
{ "_id" : ObjectId("598964d456b8c69ae1e5f36b"), "name" : "Xiaose", "age" : 35 }

上述查找命令跳過 1 個(gè)文檔,限制輸出 10 個(gè),以 name 子段正序排序(大于 0 為正序,小于 0 位反序)輸出結(jié)果。最后,可以使用 Cursor 方法中的 pretty 方法,提升查詢文檔的易讀性,特別是在查看嵌套的文檔和配置文件的時(shí)候:

> db.drivers.find().pretty()
更新(Update)

MongoDB 提供 updata 方法更新文檔:

db.collection.updateOne() 更新最多一個(gè)符合條件的文檔

db.collection.updateMany() 更新所有符合條件的文檔

db.collection.replaceOne() 替代最多一個(gè)符合條件的文檔

db.collection.update() 默認(rèn)更新一個(gè)文檔,可配置 multi 參數(shù),跟新多個(gè)文檔

以 update() 方法為例。其格式:

> db.collection.update(
    ,
    ,
    {
        upsert: ,
        multi: 
    }
)

各參數(shù)意義:

query 為查詢條件

update 為修改的文檔

upsert 為真,查詢?yōu)榭諘r(shí)插入文檔

multi 為真,更新所有符合條件的文檔

下面的命令將 name 字段為 Chen1fa 的文檔,更新 age 字段為 30:

> db.drivers.update({name:"Chen1fa"},{name:"Chen1fa", age:30})

要注意的是,如果更新文檔只傳入 age 字段,那么文檔會被更新為{age: 30},而不是{name:"Chen1fa", age:30}。要避免文檔被覆蓋,需要用到 $set 指令,$set 僅替換或添加指定字段:

> db.drivers.update({name:"Chen1fa"},{$set:{age:30}})

如果要在查詢的文檔不存在的時(shí)候插入文檔,要把 upsert 參數(shù)設(shè)置真值:

> db.drivers.update({name:"Alen"},{age:24},{upsert: true})

update 方法默認(rèn)情況只更新一個(gè)文檔,如果要更新符合條件的所有文檔,要把 multi 設(shè)為真值,并使用 $set 指令:

> db.drivers.update({age:{$gt:25}},{$set:{license:"A"}},{multi: true})
> db.drivers.update({age:{$lt:25}},{$set:{license:"C"}},{multi: true})

最終結(jié)果:

> db.dirvers.find()
{ "_id" : ObjectId("598964bd56b8c69ae1e5f36a"), "name" : "Chen1fa", "age" : 30, "license" : "A" }
{ "_id" : ObjectId("598964d456b8c69ae1e5f36b"), "name" : "Xiaose", "age" : 35, "license" : "A" }
{ "_id" : 91, "name" : "Sun1feng", "age" : 34, "license" : "A" }
{ "_id" : ObjectId("598968b3ed1eccef17e79abe"), "age" : 24, "license" : "C" }
刪除(Delete)

MongoDB 提供了 delete 方法刪除文檔:

db.collection.deleteOne() 刪除最多一個(gè)符合條件的文檔

db.collection.deleteMany() 刪除所有符合條件的文檔

db.collection.remove() 刪除一個(gè)或多個(gè)文檔

以 remove 方法為例:

> db.drivers.remove({name:"Xiaose"}) #刪除所有 name 為 Xiaose 的文檔
> db.drivers.remove({age:{$gt:30}},{justOne:true}) #刪除所有 age 大于 30 的文檔
> db.drivers.find()
{ "_id" : ObjectId("598964bd56b8c69ae1e5f36a"), "name" : "Chen1fa", "age" : 30, "license" : "A" }
{ "_id" : ObjectId("598968b3ed1eccef17e79abe"), "age" : 24, "license" : "C" }

MongoDB 提供了 drop 方法刪除集合,返回 true 表面刪除集合成功:

> db.drivers.drop() 
后話

相比傳統(tǒng)關(guān)系型數(shù)據(jù)庫,MongoDB 的 CURD 操作更像是編寫程序,更符合開發(fā)人員的直覺,不過 MongoDB 同樣也支持 SQL 語言。MongoDB 的 CURD 引擎配合索引技術(shù)、數(shù)據(jù)聚合技術(shù)和 JavaScript 引擎,賦予 MongoDB 用戶更強(qiáng)大的操縱數(shù)據(jù)的能力。

關(guān)閉實(shí)例

關(guān)閉 mongoDB 服務(wù):

> use admin
> db.shutdownServer()

使用 exit 或 Ctrl + C 斷開連接:

> exit
結(jié)語

上述,我們啟動了一個(gè)不安全的 MongoDB 實(shí)例,應(yīng)用到生產(chǎn)環(huán)境中,還需要了解 MongoDB 的安全機(jī)制,了解如何建立索引提升數(shù)據(jù)庫的讀寫速度。隨著數(shù)據(jù)的增長,需要了解副本集技術(shù)如何將多個(gè)實(shí)例部署到不同的服務(wù)器、了解分片技術(shù)對數(shù)據(jù)庫進(jìn)行橫向擴(kuò)展。為保證服務(wù)器性能和安全,需要了解如何對 MongoDB 進(jìn)行測試和監(jiān)控…

「冰封三尺,非一日之寒」,同樣,要想完全掌握 MongoDB 還有很長的路要走。愿戒驕戒躁,在學(xué)習(xí)的路上,與君共勉。

參考

Wikipedia MongoDB

MongoDB introduction

MongoDB CRUD Operations

Imooc MongoDB series course - SeanZ

MongoDB University

怎樣學(xué) MongoDB?- 知乎

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/19060.html

相關(guān)文章

  • Python3操作Mongodb簡明易懂教程

    摘要:單條記錄插入江蘇注意接下來的操作中會忽略掉數(shù)據(jù)庫連接操作,直接寫核心代碼,請自行補(bǔ)上。江蘇我們再隨便插入點(diǎn)兒數(shù)據(jù)供下面操作使用。江蘇北京上海王二麻廣東條件查詢只要將查詢條件當(dāng)做參數(shù)塞入即可篩選數(shù)據(jù)。王二麻刪除全部數(shù)據(jù)慎用 Pymongo是python的一個(gè)操作Mongodb的庫。 下面我們直接簡列出一些常用操作命令。 連接數(shù)據(jù)庫 鏈接數(shù)據(jù)庫需要提供一個(gè)地址和接口即可。首先還是要導(dǎo)入包。...

    Jensen 評論0 收藏0
  • Python3操作Mongodb簡明易懂教程

    摘要:單條記錄插入江蘇注意接下來的操作中會忽略掉數(shù)據(jù)庫連接操作,直接寫核心代碼,請自行補(bǔ)上。江蘇我們再隨便插入點(diǎn)兒數(shù)據(jù)供下面操作使用。江蘇北京上海王二麻廣東條件查詢只要將查詢條件當(dāng)做參數(shù)塞入即可篩選數(shù)據(jù)。王二麻刪除全部數(shù)據(jù)慎用 Pymongo是python的一個(gè)操作Mongodb的庫。 下面我們直接簡列出一些常用操作命令。 連接數(shù)據(jù)庫 鏈接數(shù)據(jù)庫需要提供一個(gè)地址和接口即可。首先還是要導(dǎo)入包。...

    lbool 評論0 收藏0
  • 簡明 MongoDB 入門教程

    摘要:在配置的時(shí)候使用絕對路徑替代相對路徑,有利于在排查故障時(shí)查找進(jìn)程啟動的目錄。在添加授權(quán)用戶和開啟認(rèn)證后,這些警告會自動消失。投影文檔中字段為或真值表示包含,或假值表示排除,可以設(shè)置多個(gè)字段為或,但不能混合使用。 MongoDB 是免費(fèi)開源的跨平臺 NoSQL 數(shù)據(jù)庫,命名源于英文單詞 humongous,意思是「巨大無比」,可見開發(fā)組對 MongoDB 的定位。與關(guān)系型數(shù)據(jù)庫不同,Mo...

    shery 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<