訂閱
糾錯(cuò)
加入自媒體

技術(shù)棧 | MongoDB的最合理用法

概要

為什么要用Mongodb數(shù)據(jù)庫(kù)呢?

怎么安裝以及使用Mongodb?

NoSQL的簡(jiǎn)介:

NoSQL(NoSQL = Not Only SQL ),意即"不僅僅是SQL"。

在現(xiàn)代的計(jì)算系統(tǒng)上每天網(wǎng)絡(luò)上都會(huì)產(chǎn)生龐大的數(shù)據(jù)量。

這些數(shù)據(jù)有很大一部分是由關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)來(lái)處理。1970年E.F.Codd's提出的關(guān)系模型的論文"A relational model of data for large shared data banks",這使得數(shù)據(jù)建模和應(yīng)用程序編程更加簡(jiǎn)單。

通過(guò)應(yīng)用實(shí)踐證明,關(guān)系模型是非常適合于客戶服務(wù)器編程,遠(yuǎn)遠(yuǎn)超出預(yù)期的利益,今天它是結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)在網(wǎng)絡(luò)和商務(wù)應(yīng)用的主導(dǎo)技術(shù)。

NoSQL 是一項(xiàng)全新的數(shù)據(jù)庫(kù)革命性運(yùn)動(dòng),早期就有人提出,發(fā)展至2009年趨勢(shì)越發(fā)高漲。NoSQL的擁護(hù)者們提倡運(yùn)用非關(guān)系型的數(shù)據(jù)存儲(chǔ),相對(duì)于鋪天蓋地的關(guān)系型數(shù)據(jù)庫(kù)運(yùn)用,這一概念無(wú)疑是一種全新的思維的注入。

對(duì)于一名程序員來(lái)說(shuō),使用NoSQL應(yīng)成為一條必備技能。

關(guān)系型和非關(guān)系型的介紹:

對(duì)于關(guān)系型數(shù)據(jù)庫(kù),存儲(chǔ)數(shù)據(jù)的時(shí)候需要提前建表建庫(kù),隨著數(shù)據(jù)的復(fù)雜度越來(lái)越高,所建的表的數(shù)量也越來(lái)越多,但是非關(guān)系型卻不需要。

什么是MongoDB?

MongoDB 是由C++語(yǔ)言編寫(xiě)的,是一個(gè)基于分布式文件存儲(chǔ)的開(kāi)源數(shù)據(jù)庫(kù)系統(tǒng)。

在高負(fù)載的情況下,添加更多的節(jié)點(diǎn),可以保證服務(wù)器性能。MongoDB 旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。

MongoDB 將數(shù)據(jù)存儲(chǔ)為一個(gè)文檔,數(shù)據(jù)結(jié)構(gòu)由鍵值(key=>value)對(duì)組成。MongoDB 文檔類似于JSON 對(duì)象。字段值可以包含其他文檔,數(shù)組及文檔數(shù)組。

MongoDB的特點(diǎn):

MongoDB 是一個(gè)面向文檔存儲(chǔ)的數(shù)據(jù)庫(kù),操作起來(lái)比較簡(jiǎn)單和容易。

你可以在MongoDB記錄中設(shè)置任何屬性的索引(如:FirstName="Sameer",Address="8 Gandhi Road")來(lái)實(shí)現(xiàn)更快的排序。

你可以通過(guò)本地或者網(wǎng)絡(luò)創(chuàng)建數(shù)據(jù)鏡像,這使得MongoDB有更強(qiáng)的擴(kuò)展性。

如果負(fù)載的增加(需要更多的存儲(chǔ)空間和更強(qiáng)的處理能力) ,它可以分布在計(jì)算機(jī)網(wǎng)絡(luò)中的其他節(jié)點(diǎn)上這就是所謂的分片。

Mongo支持豐富的查詢表達(dá)式。查詢指令使用JSON形式的標(biāo)記,可輕易查詢文檔中內(nèi)嵌的對(duì)象及數(shù)組。

MongoDb 使用update()命令可以實(shí)現(xiàn)替換完成的文檔(數(shù)據(jù))或者一些指定的數(shù)據(jù)字段 。

Mongodb中的Map/reduce主要是用來(lái)對(duì)數(shù)據(jù)進(jìn)行批量處理和聚合操作。

Map和Reduce。Map函數(shù)調(diào)用emit(key,value)遍歷集合中所有的記錄,將key與value傳給Reduce函數(shù)進(jìn)行處理。

Map函數(shù)和Reduce函數(shù)是使用Javascript編寫(xiě)的,并可以通過(guò)db.runCommand或mapreduce命令來(lái)執(zhí)行MapReduce操作。

GridFS是MongoDB中的一個(gè)內(nèi)置功能,可以用于存放大量小文件。

MongoDB允許在服務(wù)端執(zhí)行腳本,可以用Javascript編寫(xiě)某個(gè)函數(shù),直接在服務(wù)端執(zhí)行,也可以把函數(shù)的定義存儲(chǔ)在服務(wù)端,下次直接調(diào)用即可。

MongoDB支持各種編程語(yǔ)言:RUBY,PYTHON,JAVA,C++,PHP,C#等多種語(yǔ)言。

MongoDB安裝簡(jiǎn)單

MongoDB的優(yōu)勢(shì):

易擴(kuò)展:NoSQL數(shù)據(jù)庫(kù)種類繁多,但是都有一個(gè)共同的特點(diǎn)都是去掉去掉關(guān)系數(shù)據(jù)型特性。數(shù)據(jù)之間無(wú)關(guān)系,這樣就非常容易擴(kuò)展。

大數(shù)據(jù)量,高性能:NoSQL數(shù)據(jù)庫(kù)都有非常高的讀寫(xiě)性能,尤其在大數(shù)據(jù)量下,同樣表現(xiàn)優(yōu)秀。這得益于它的無(wú)關(guān)系型,數(shù)據(jù)庫(kù)的結(jié)構(gòu)簡(jiǎn)單。

靈活的數(shù)據(jù)模型:NoSQL無(wú)需事先為要存儲(chǔ)的數(shù)據(jù)建立字段,隨時(shí)可以存儲(chǔ)自定義的數(shù)據(jù)格式。而在關(guān)系數(shù)據(jù)庫(kù)里,增刪字段是一件非常麻煩的事情。如果是非常大數(shù)據(jù)量的表,增加字段簡(jiǎn)直就是一個(gè)噩夢(mèng)。

MongoDB的安裝:

6.1命令的安裝

sudo apt-get install -y mongodb

6.2源碼安裝

6.3 服務(wù)器mongodb的啟動(dòng)

啟動(dòng)方式1:

啟動(dòng):sudo service mongod start(sudo service mongodb start,mongod 改為mongodb。下同)

停止:sudo service mongodb stop

重啟:sudo service mongodb restart

配置文件的位置:/etc/mongod.conf

日志的位置:/var/log/mongodb/mongod.log

默認(rèn)端口:27017

啟動(dòng)方式2:

啟動(dòng):sudo mongod [--dbbath=dbpath –logpath=logpath –-append -fork] [ -f logfile]

只以sudo mongod命令啟動(dòng)時(shí),默認(rèn)將數(shù)據(jù)存放在了/data/db目錄下,需要手動(dòng)創(chuàng)建

--dnpath:指定數(shù)據(jù)的存放路徑

--logpath:指定日志的存放路徑

--logappend:設(shè)置日志的寫(xiě)入形式為追加模式

-fork:開(kāi)啟新的進(jìn)程運(yùn)行mongodb服務(wù)

f:配置文件(可以將上述配置信息 寫(xiě)入文件然后通過(guò)本參數(shù)進(jìn)行加載啟動(dòng))

6.4 客戶端mongodb

啟動(dòng)本地客戶端:mongo

查看幫助:mongo-h(huán)elp

退出:exit或者ctrl+c

為什么要進(jìn)行權(quán)限管理的設(shè)置?

剛安裝完畢的mongodb默認(rèn)不使用權(quán)限認(rèn)證方式啟動(dòng),與MySQL不同,mongodb在安裝的時(shí)候并沒(méi)有設(shè)置權(quán)限,然而公網(wǎng)運(yùn)行系統(tǒng)需要設(shè)置權(quán)限以保證數(shù)據(jù)安全。

Mongodb超級(jí)管理員賬號(hào)的創(chuàng)建

8.1以權(quán)限認(rèn)證的方式啟動(dòng)mongodb數(shù)據(jù)庫(kù)

sudo mongod  --auth

8.2啟動(dòng)之后在啟動(dòng)信息會(huì)有如下信息,說(shuō)明mongodb以權(quán)限認(rèn)證的方式啟動(dòng)成功

[initandlisten] options: { security: { authorization: "enabled" } }

8.3創(chuàng)建超級(jí)用戶 使用admin數(shù)據(jù)庫(kù)(超級(jí)管理員賬號(hào)必須創(chuàng)建在改數(shù)據(jù)庫(kù)上)

use admin

創(chuàng)建超級(jí)用戶

db.createUser({"user":"python","pwd":"python","roles":["root"]})

創(chuàng)建成功后會(huì)顯示如下信息

uccessfully added user:{"user":"python","roles":["root"]}

8.4退出客戶端再次登錄驗(yàn)證 此時(shí)再使用數(shù)據(jù)庫(kù)各命令的時(shí)候,會(huì)報(bào)權(quán)限錯(cuò)誤,需要認(rèn)證才能執(zhí)行相應(yīng)操作

user admin

db.a(chǎn)uth(‘python’,’python’)

1

Python 用戶創(chuàng)建在admin數(shù)據(jù)庫(kù)上的所以必須來(lái)到admin數(shù)據(jù)庫(kù)上進(jìn)行認(rèn)證,認(rèn)證成功會(huì)返回1,失敗返回0

創(chuàng)建普通用戶

9.1選擇需要?jiǎng)?chuàng)建用戶的數(shù)據(jù)庫(kù)

use test1

9.2 在使用的數(shù)據(jù)庫(kù)上創(chuàng)建普通用戶

db.createUser("user":"user1", "pwd":"pwd1", roles:["read"])

創(chuàng)建普通用戶user1,該用戶在test1上的權(quán)限是只讀

db.createUser("user":"user1", "pwd":"pwd1", roles:["readWrite"])

創(chuàng)建普通用戶user1,該用戶在test1上的權(quán)限是讀寫(xiě)

9.3 在其他數(shù)據(jù)庫(kù)上創(chuàng)建普通用戶

Useradmin

db.createUser({“user”:”python1”,”pwwd”:”python1”,roles:[{“role”:”read”,”db”:dbname1},{“role”:”

readWrite”,”db:”dbname2”}]})

在admin上創(chuàng)建python1用戶,python1用戶的權(quán)限有兩個(gè),一個(gè)在dbname1上只讀,另一個(gè)是在dbname2上的讀寫(xiě)

查看創(chuàng)建的用戶

show users

“id”:”admin.python”,

“user”:”python”,

“db”:”admin”,

“roles”:[

“role”:”root”,

“db”:”admin”

}]

刪除用戶

db.dropUser(‘python’)

Mongodb中常見(jiàn)的數(shù)據(jù)類型

11.1 常見(jiàn)類型

Object ID:文檔ID

String:字符串,最常用,必須是有效的UTF-8

Boolean:存儲(chǔ)一個(gè)布爾值,true或false

Integer:整數(shù)可以是32位活著64位,這取決于服務(wù)器

Double:存儲(chǔ)浮點(diǎn)值

Arrays:數(shù)組或列表,多個(gè)值存儲(chǔ)到一個(gè)鍵

Object:用于嵌入式的文檔,即一個(gè)值為一個(gè)文檔

Null:存儲(chǔ)Null值

Timestamp:時(shí)間戳,表示從1970-1-1到現(xiàn)在的總秒數(shù)

Date:存儲(chǔ)當(dāng)前日期或時(shí)間的UNIX時(shí)間格式

11.2注意點(diǎn)

每個(gè)文檔都有一個(gè)屬性,為_id,保證每個(gè)文檔的唯一性,mongodb默認(rèn)使用_id為主鍵。

可以自己去設(shè)置_id插入文檔,如果沒(méi)有提供,那么mongodb為每個(gè)文檔提供了一個(gè)獨(dú)特的_id,類型為objectID

objectID是個(gè)12字節(jié)的六進(jìn)制數(shù),每個(gè)字節(jié)兩位,一共是24 位的字符串: 前4個(gè)字節(jié)為當(dāng)前時(shí)間戳 接下來(lái)3個(gè)字節(jié)的機(jī)器ID 接下來(lái)的2個(gè)字節(jié)中MongoDB的服務(wù)進(jìn)程id 最后3個(gè)字節(jié)是簡(jiǎn)單的增量值。

Mongodb中常見(jiàn)的增刪改查

12.1 mongodb的插入

db.Collectionname.insert(document)

db.stu.insert({name:”ll”,gender:1})

db.stu.insert({_id:”1111”,name:”ll”,gender:1})

插入文檔時(shí),如果不指定_id參數(shù),Mongodb會(huì)為文檔分配一個(gè)唯一的Oobjectid

12.1 mongodb的保存

命令:db.Collectionname.save(document) 如果?檔的_id已經(jīng)存在則修改, 如果?檔的  _id不存在則添加

12.2 mongodb的簡(jiǎn)單查詢

命令:db.Collectionname.find()

12.3 mongodb的更新

db.Collectionname.update(

參數(shù)query:查詢條件

參數(shù)update:更新操作符

參數(shù)multi:可選,默認(rèn)時(shí)false,表示只更新找到的第一條記錄,值為true表示把滿足條件的文檔全部更新

db.stu.update({name:'hr'},{name:'mnc'})           全文檔進(jìn)行覆蓋更新

db.stu.update({name:'hr'},{$set:{name:'hys'}})    指定鍵值更新操作

db.stu.update({},{$set:{gender:0}},{multi:true})   更新全部

12.4mongodb的刪除

db. Collectionname.remove(

參數(shù)query:可選,刪除的文檔的條件

參數(shù)query:可選,如果設(shè)為true或1,則只刪除一條,默認(rèn)false,表示刪除多條

Mongodb和python交互

Pymongo提供了mongdb和python交互的所有方法,安裝方式:

Pip install pymongo

13.1 使用mongodb,導(dǎo)入pymongo并選擇要操作的集合

數(shù)據(jù)庫(kù)和集合會(huì)自動(dòng)創(chuàng)建

from pymongo import MongoClient

client = MongoClient(host,port)

collection = client[db名][集合名]

13.2添加數(shù)據(jù)

Insert可以批量的插入數(shù)據(jù)列表,也可以插入一條數(shù)據(jù)

collection.insert([{"name":"test10010","age":33},{"name":"test10011","age":34}]/{"na me":"test10010","age":33})

13.3添加一條數(shù)據(jù)

ret = collection.insert_one({"name":"test10010","age":33})

print(ret)

13.4添加多條數(shù)據(jù)

item_list = [{"name":"test1000{}".format(i)} for i in range(10)]

#insert_many接收一個(gè)列表,列表中為所有需要插入的字典

t = collection.insert_many(item_list)

13.4查找一條數(shù)據(jù)

#find_one查找并且返回一個(gè)結(jié)果,接收一個(gè)字典形式的條件

t = collection.find_one({"name":"test10005"})

print(t)

13.5 查找全部數(shù)據(jù)

結(jié)果是一個(gè)Cursor游標(biāo)對(duì)象,是一個(gè)可迭代對(duì)象,可以類似讀文件的指針,但是只能夠進(jìn)行一次讀取

#find返回所有滿足條件的結(jié)果,如果條件為空,則返回?cái)?shù)據(jù)庫(kù)的所有t = collection.find({"name":"test10005"})#結(jié)果是一個(gè)Cursor游標(biāo)對(duì)象,是一個(gè)可迭代對(duì)象,可以類似讀文件的指針

for i in t:    print(i)for i in t: #此時(shí)t中沒(méi)有內(nèi)容    print(i)

13.6更新一條數(shù)據(jù)

#update_one更新一條數(shù)據(jù)collection.update({"name":"test10005"},{"name":"new_test10005"},multi=True/False)

13.7更新一條數(shù)據(jù)(注意使用$set命令)

#update_one更新一條數(shù)據(jù)collection.update_one({"name":"test10005"},{"$set":{"name":"new_test10005"}})

13.8更新全部數(shù)據(jù)

# update_one更新全部數(shù)據(jù)collection.update_many({"name":"test10005"},{"$set":{"name":"new_test10005"}})

13.9插入更新數(shù)據(jù)

#update_one更新一條數(shù)據(jù)collection.update({"name":"test10005"},{"$set":{"name":"new_test10005"}},upsert=True)13.10刪除一條數(shù)據(jù)#delete_one刪除一條數(shù)據(jù)collection.delete_one({"name":"test10010"})13.11 刪除全部數(shù)據(jù)#delete_may刪除所有滿足條件的數(shù)據(jù)collection.delete_many({"name":"test10010"})

13.10刪除一條數(shù)據(jù)

#delete_one刪除一條數(shù)據(jù)

collection.delete_one({"name":"test10010"})

13.11 刪除全部數(shù)據(jù)

#delete_may刪除所有滿足條件的數(shù)據(jù)

collection.delete_many({"name":"test10010"})

總結(jié):以上就是Mongodb的簡(jiǎn)單使用,在大數(shù)據(jù)時(shí)代,對(duì)數(shù)據(jù)的保存也越來(lái)越重視,非關(guān)系型數(shù)據(jù)庫(kù)大大減少了我們工作的負(fù)擔(dān)。

聲明: 本文由入駐維科號(hào)的作者撰寫(xiě),觀點(diǎn)僅代表作者本人,不代表OFweek立場(chǎng)。如有侵權(quán)或其他問(wèn)題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過(guò)于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無(wú)評(píng)論

暫無(wú)評(píng)論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號(hào)
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯(cuò)
x
*文字標(biāo)題:
*糾錯(cuò)內(nèi)容:
聯(lián)系郵箱:
*驗(yàn) 證 碼:

粵公網(wǎng)安備 44030502002758號(hào)