技術(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)單。
通過應(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)說,使用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ǔ)言編寫的,是一個(gè)基于分布式文件存儲(chǔ)的開源數(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)更快的排序。
你可以通過本地或者網(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編寫的,并可以通過db.runCommand或mapreduce命令來(lái)執(zhí)行MapReduce操作。
GridFS是MongoDB中的一個(gè)內(nèi)置功能,可以用于存放大量小文件。
MongoDB允許在服務(wù)端執(zhí)行腳本,可以用Javascript編寫某個(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ù)都有非常高的讀寫性能,尤其在大數(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è)置日志的寫入形式為追加模式
-fork:開啟新的進(jìn)程運(yùn)行mongodb服務(wù)
f:配置文件(可以將上述配置信息 寫入文件然后通過本參數(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í)候并沒有設(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ì)有如下信息,說明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)限是讀寫
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上的讀寫
查看創(chuàng)建的用戶
show users
{
“id”:”admin.python”,
“user”:”python”,
“db”:”admin”,
“roles”:[
{
“role”:”root”,
“db”:”admin”
}]
}
刪除用戶
db.dropUser(‘python’)
Mongodb中常見的數(shù)據(jù)類型
11.1 常見類型
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插入文檔,如果沒有提供,那么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中常見的增刪改查
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中沒有內(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è)字
您提交的評(píng)論過于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)
圖片新聞
-
機(jī)器人奧運(yùn)會(huì)戰(zhàn)報(bào):宇樹機(jī)器人摘下首金,天工Ultra搶走首位“百米飛人”
-
存儲(chǔ)圈掐架!江波龍起訴佰維,索賠121萬(wàn)
-
長(zhǎng)安汽車母公司突然更名:從“中國(guó)長(zhǎng)安”到“辰致科技”
-
豆包前負(fù)責(zé)人喬木出軌BP后續(xù):均被辭退
-
字節(jié)AI Lab負(fù)責(zé)人李航卸任后返聘,Seed進(jìn)入調(diào)整期
-
員工持股爆雷?廣汽埃安緊急回應(yīng)
-
中國(guó)“智造”背后的「關(guān)鍵力量」
-
小米汽車研發(fā)中心重磅落地,寶馬家門口“搶人”
最新活動(dòng)更多
-
10月23日火熱報(bào)名中>> 2025是德科技創(chuàng)新技術(shù)峰會(huì)
-
10月23日立即報(bào)名>> Works With 開發(fā)者大會(huì)深圳站
-
10月24日立即參評(píng)>> 【評(píng)選】維科杯·OFweek 2025(第十屆)物聯(lián)網(wǎng)行業(yè)年度評(píng)選
-
11月27日立即報(bào)名>> 【工程師系列】汽車電子技術(shù)在線大會(huì)
-
12月18日立即報(bào)名>> 【線下會(huì)議】OFweek 2025(第十屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
-
精彩回顧立即查看>> 【限時(shí)福利】TE 2025國(guó)際物聯(lián)網(wǎng)展·深圳站
推薦專題