技術(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)。
發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
即日-11.13立即報(bào)名>>> 【在線會(huì)議】多物理場(chǎng)仿真助跑新能源汽車(chē)
-
11月28日立即報(bào)名>>> 2024工程師系列—工業(yè)電子技術(shù)在線會(huì)議
-
12月19日立即報(bào)名>> 【線下會(huì)議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
-
即日-12.26火熱報(bào)名中>> OFweek2024中國(guó)智造CIO在線峰會(huì)
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書(shū)》
-
精彩回顧立即查看>> 【限時(shí)免費(fèi)下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
推薦專題
- 1 【一周車(chē)話】沒(méi)有方向盤(pán)和踏板的車(chē),你敢坐嗎?
- 2 特斯拉發(fā)布無(wú)人駕駛車(chē),還未迎來(lái)“Chatgpt時(shí)刻”
- 3 特斯拉股價(jià)大跌15%:Robotaxi離落地還差一個(gè)蘿卜快跑
- 4 馬斯克給的“驚喜”夠嗎?
- 5 打完“價(jià)格戰(zhàn)”,大模型還要比什么?
- 6 馬斯克致敬“國(guó)產(chǎn)蘿卜”?
- 7 神經(jīng)網(wǎng)絡(luò),誰(shuí)是盈利最強(qiáng)企業(yè)?
- 8 比蘋(píng)果偉大100倍!真正改寫(xiě)人類歷史的智能產(chǎn)品降臨
- 9 諾獎(jiǎng)進(jìn)入“AI時(shí)代”,人類何去何從?
- 10 Open AI融資后成萬(wàn)億獨(dú)角獸,AI人才之爭(zhēng)開(kāi)啟
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷(xiāo)售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷(xiāo)售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門(mén)市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市