訂閱
糾錯
加入自媒體

技術棧 | MongoDB的最合理用法

2018-12-06 05:02
啟迪云計算
關注

概要

為什么要用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ù)庫大大減少了我們工作的負擔。

聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

    掃碼關注公眾號
    OFweek人工智能網
    獲取更多精彩內容
    文章糾錯
    x
    *文字標題:
    *糾錯內容:
    聯(lián)系郵箱:
    *驗 證 碼:

    粵公網安備 44030502002758號