技術棧 | MongoDB的最合理用法
概要
為什么要用Mongodb數(shù)據(jù)庫呢?
怎么安裝以及使用Mongodb?
NoSQL的簡介:
NoSQL(NoSQL = Not Only SQL ),意即"不僅僅是SQL"。
在現(xiàn)代的計算系統(tǒng)上每天網絡上都會產生龐大的數(shù)據(jù)量。
這些數(shù)據(jù)有很大一部分是由關系數(shù)據(jù)庫管理系統(tǒng)(RDBMS)來處理。1970年E.F.Codd's提出的關系模型的論文"A relational model of data for large shared data banks",這使得數(shù)據(jù)建模和應用程序編程更加簡單。
通過應用實踐證明,關系模型是非常適合于客戶服務器編程,遠遠超出預期的利益,今天它是結構化數(shù)據(jù)存儲在網絡和商務應用的主導技術。
NoSQL 是一項全新的數(shù)據(jù)庫革命性運動,早期就有人提出,發(fā)展至2009年趨勢越發(fā)高漲。NoSQL的擁護者們提倡運用非關系型的數(shù)據(jù)存儲,相對于鋪天蓋地的關系型數(shù)據(jù)庫運用,這一概念無疑是一種全新的思維的注入。
對于一名程序員來說,使用NoSQL應成為一條必備技能。
關系型和非關系型的介紹:
對于關系型數(shù)據(jù)庫,存儲數(shù)據(jù)的時候需要提前建表建庫,隨著數(shù)據(jù)的復雜度越來越高,所建的表的數(shù)量也越來越多,但是非關系型卻不需要。
什么是MongoDB?
MongoDB 是由C++語言編寫的,是一個基于分布式文件存儲的開源數(shù)據(jù)庫系統(tǒng)。
在高負載的情況下,添加更多的節(jié)點,可以保證服務器性能。MongoDB 旨在為WEB應用提供可擴展的高性能數(shù)據(jù)存儲解決方案。
MongoDB 將數(shù)據(jù)存儲為一個文檔,數(shù)據(jù)結構由鍵值(key=>value)對組成。MongoDB 文檔類似于JSON 對象。字段值可以包含其他文檔,數(shù)組及文檔數(shù)組。
MongoDB的特點:
MongoDB 是一個面向文檔存儲的數(shù)據(jù)庫,操作起來比較簡單和容易。
你可以在MongoDB記錄中設置任何屬性的索引(如:FirstName="Sameer",Address="8 Gandhi Road")來實現(xiàn)更快的排序。
你可以通過本地或者網絡創(chuàng)建數(shù)據(jù)鏡像,這使得MongoDB有更強的擴展性。
如果負載的增加(需要更多的存儲空間和更強的處理能力) ,它可以分布在計算機網絡中的其他節(jié)點上這就是所謂的分片。
Mongo支持豐富的查詢表達式。查詢指令使用JSON形式的標記,可輕易查詢文檔中內嵌的對象及數(shù)組。
MongoDb 使用update()命令可以實現(xiàn)替換完成的文檔(數(shù)據(jù))或者一些指定的數(shù)據(jù)字段 。
Mongodb中的Map/reduce主要是用來對數(shù)據(jù)進行批量處理和聚合操作。
Map和Reduce。Map函數(shù)調用emit(key,value)遍歷集合中所有的記錄,將key與value傳給Reduce函數(shù)進行處理。
Map函數(shù)和Reduce函數(shù)是使用Javascript編寫的,并可以通過db.runCommand或mapreduce命令來執(zhí)行MapReduce操作。
GridFS是MongoDB中的一個內置功能,可以用于存放大量小文件。
MongoDB允許在服務端執(zhí)行腳本,可以用Javascript編寫某個函數(shù),直接在服務端執(zhí)行,也可以把函數(shù)的定義存儲在服務端,下次直接調用即可。
MongoDB支持各種編程語言:RUBY,PYTHON,JAVA,C++,PHP,C#等多種語言。
MongoDB安裝簡單
MongoDB的優(yōu)勢:
易擴展:NoSQL數(shù)據(jù)庫種類繁多,但是都有一個共同的特點都是去掉去掉關系數(shù)據(jù)型特性。數(shù)據(jù)之間無關系,這樣就非常容易擴展。
大數(shù)據(jù)量,高性能:NoSQL數(shù)據(jù)庫都有非常高的讀寫性能,尤其在大數(shù)據(jù)量下,同樣表現(xiàn)優(yōu)秀。這得益于它的無關系型,數(shù)據(jù)庫的結構簡單。
靈活的數(shù)據(jù)模型:NoSQL無需事先為要存儲的數(shù)據(jù)建立字段,隨時可以存儲自定義的數(shù)據(jù)格式。而在關系數(shù)據(jù)庫里,增刪字段是一件非常麻煩的事情。如果是非常大數(shù)據(jù)量的表,增加字段簡直就是一個噩夢。
MongoDB的安裝:
6.1命令的安裝
sudo apt-get install -y mongodb
6.2源碼安裝
6.3 服務器mongodb的啟動
啟動方式1:
啟動: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
默認端口:27017
啟動方式2:
啟動:sudo mongod [--dbbath=dbpath –logpath=logpath –-append -fork] [ -f logfile]
只以sudo mongod命令啟動時,默認將數(shù)據(jù)存放在了/data/db目錄下,需要手動創(chuàng)建
--dnpath:指定數(shù)據(jù)的存放路徑
--logpath:指定日志的存放路徑
--logappend:設置日志的寫入形式為追加模式
-fork:開啟新的進程運行mongodb服務
f:配置文件(可以將上述配置信息 寫入文件然后通過本參數(shù)進行加載啟動)
6.4 客戶端mongodb
啟動本地客戶端:mongo
查看幫助:mongo-h(huán)elp
退出:exit或者ctrl+c
為什么要進行權限管理的設置?
剛安裝完畢的mongodb默認不使用權限認證方式啟動,與MySQL不同,mongodb在安裝的時候并沒有設置權限,然而公網運行系統(tǒng)需要設置權限以保證數(shù)據(jù)安全。
Mongodb超級管理員賬號的創(chuàng)建
8.1以權限認證的方式啟動mongodb數(shù)據(jù)庫
sudo mongod --auth
8.2啟動之后在啟動信息會有如下信息,說明mongodb以權限認證的方式啟動成功
[initandlisten] options: { security: { authorization: "enabled" } }
8.3創(chuàng)建超級用戶 使用admin數(shù)據(jù)庫(超級管理員賬號必須創(chuàng)建在改數(shù)據(jù)庫上)
use admin
創(chuàng)建超級用戶
db.createUser({"user":"python","pwd":"python","roles":["root"]})
創(chuàng)建成功后會顯示如下信息
uccessfully added user:{"user":"python","roles":["root"]}
8.4退出客戶端再次登錄驗證 此時再使用數(shù)據(jù)庫各命令的時候,會報權限錯誤,需要認證才能執(zhí)行相應操作
user admin
db.auth(‘python’,’python’)
1
Python 用戶創(chuàng)建在admin數(shù)據(jù)庫上的所以必須來到admin數(shù)據(jù)庫上進行認證,認證成功會返回1,失敗返回0
創(chuàng)建普通用戶
9.1選擇需要創(chuàng)建用戶的數(shù)據(jù)庫
use test1
9.2 在使用的數(shù)據(jù)庫上創(chuàng)建普通用戶
db.createUser("user":"user1", "pwd":"pwd1", roles:["read"])
創(chuàng)建普通用戶user1,該用戶在test1上的權限是只讀
db.createUser("user":"user1", "pwd":"pwd1", roles:["readWrite"])
創(chuàng)建普通用戶user1,該用戶在test1上的權限是讀寫
9.3 在其他數(shù)據(jù)庫上創(chuàng)建普通用戶
Useradmin
db.createUser({“user”:”python1”,”pwwd”:”python1”,roles:[{“role”:”read”,”db”:dbname1},{“role”:”
readWrite”,”db:”dbname2”}]})
在admin上創(chuàng)建python1用戶,python1用戶的權限有兩個,一個在dbname1上只讀,另一個是在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:存儲一個布爾值,true或false
Integer:整數(shù)可以是32位活著64位,這取決于服務器
Double:存儲浮點值
Arrays:數(shù)組或列表,多個值存儲到一個鍵
Object:用于嵌入式的文檔,即一個值為一個文檔
Null:存儲Null值
Timestamp:時間戳,表示從1970-1-1到現(xiàn)在的總秒數(shù)
Date:存儲當前日期或時間的UNIX時間格式
11.2注意點
每個文檔都有一個屬性,為_id,保證每個文檔的唯一性,mongodb默認使用_id為主鍵。
可以自己去設置_id插入文檔,如果沒有提供,那么mongodb為每個文檔提供了一個獨特的_id,類型為objectID
objectID是個12字節(jié)的六進制數(shù),每個字節(jié)兩位,一共是24 位的字符串: 前4個字節(jié)為當前時間戳 接下來3個字節(jié)的機器ID 接下來的2個字節(jié)中MongoDB的服務進程id 最后3個字節(jié)是簡單的增量值。
Mongodb中常見的增刪改查
12.1 mongodb的插入
db.Collectionname.insert(document)
db.stu.insert({name:”ll”,gender:1})
db.stu.insert({_id:”1111”,name:”ll”,gender:1})
插入文檔時,如果不指定_id參數(shù),Mongodb會為文檔分配一個唯一的Oobjectid
12.1 mongodb的保存
命令:db.Collectionname.save(document) 如果?檔的_id已經存在則修改, 如果?檔的 _id不存在則添加
12.2 mongodb的簡單查詢
命令:db.Collectionname.find()
12.3 mongodb的更新
db.Collectionname.update(
參數(shù)query:查詢條件
參數(shù)update:更新操作符
參數(shù)multi:可選,默認時false,表示只更新找到的第一條記錄,值為true表示把滿足條件的文檔全部更新
db.stu.update({name:'hr'},{name:'mnc'}) 全文檔進行覆蓋更新
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:可選,如果設為true或1,則只刪除一條,默認false,表示刪除多條
Mongodb和python交互
Pymongo提供了mongdb和python交互的所有方法,安裝方式:
Pip install pymongo
13.1 使用mongodb,導入pymongo并選擇要操作的集合
數(shù)據(jù)庫和集合會自動創(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接收一個列表,列表中為所有需要插入的字典
t = collection.insert_many(item_list)
13.4查找一條數(shù)據(jù)
#find_one查找并且返回一個結果,接收一個字典形式的條件
t = collection.find_one({"name":"test10005"})
print(t)
13.5 查找全部數(shù)據(jù)
結果是一個Cursor游標對象,是一個可迭代對象,可以類似讀文件的指針,但是只能夠進行一次讀取
#find返回所有滿足條件的結果,如果條件為空,則返回數(shù)據(jù)庫的所有t = collection.find({"name":"test10005"})#結果是一個Cursor游標對象,是一個可迭代對象,可以類似讀文件的指針
for i in t: print(i)for i in t: #此時t中沒有內容 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"})
總結:以上就是Mongodb的簡單使用,在大數(shù)據(jù)時代,對數(shù)據(jù)的保存也越來越重視,非關系型數(shù)據(jù)庫大大減少了我們工作的負擔。

請輸入評論內容...
請輸入評論/評論長度6~500個字
最新活動更多
推薦專題
- 1 UALink規(guī)范發(fā)布:挑戰(zhàn)英偉達AI統(tǒng)治的開始
- 2 北電數(shù)智主辦酒仙橋論壇,探索AI產業(yè)發(fā)展新路徑
- 3 “AI寒武紀”爆發(fā)至今,五類新物種登上歷史舞臺
- 4 降薪、加班、裁員三重暴擊,“AI四小龍”已折戟兩家
- 5 國產智駕迎戰(zhàn)特斯拉FSD,AI含量差幾何?
- 6 光計算迎來商業(yè)化突破,但落地仍需時間
- 7 東陽光:2024年扭虧、一季度凈利大增,液冷疊加具身智能打開成長空間
- 8 封殺AI“照騙”,“淘寶們”終于不忍了?
- 9 優(yōu)必選:營收大增主靠小件,虧損繼續(xù)又逢關稅,能否乘機器人東風翻身?
- 10 地平線自動駕駛方案解讀