標籤:
1. MongoDB簡介
MongoDB是一個跨平台的基於Key_Value索引值對形式儲存資料的NoSQL文件類型資料庫。
NoSQL(not only sql)資料庫,泛指非關係型資料庫。
1.1 NoSQL資料庫的特點
l 不需要預定義模式
不需要事先定義資料模式,預定義表結構。資料中的每條記錄都可能有不同的屬性和格式。當插入資料時,並不需要預先定義它們的模式。
l 無共用架構
相對於將所有資料存放區的存放區域網路中的全共用架構。NoSQL往往將資料劃分後儲存在各個本機伺服器上。因為從本地磁碟讀取資料的效能往往好於通過網路傳輸讀取資料的效能,從而提高了系統的效能。
l 彈性可擴充
可以在系統啟動並執行時候,動態增加或者刪除結點。不需要停機維護,資料可以自動遷移。
l 分區
相對於將資料存放於同一個節點,NoSQL資料庫需要將資料進行分區,將記錄分散在多個節點上面。並且通常分區的同時還要做複製。這樣既提高了並行效能,又能保證沒有單點失效的問題。
l 非同步複製
和RAID儲存系統不同的是,NoSQL中的複製,往往是基於日誌的非同步複製。這樣,資料就可以儘快地寫入一個節點,而不會被網路傳輸引起遲延。缺點是並不總是能保證一致性,這樣的方式在出現故障的時候,可能會丟失少量的資料。
l BASE
相對於事務嚴格的ACID特性,NoSQL資料庫保證的是BASE特性。BASE是最終一致性和軟事務。
1.2 NoSql資料庫的分類
分類 |
Examples舉例 |
典型應用情境 |
資料模型 |
優點 |
缺點 |
索引值(key-value) |
Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB |
內容緩衝,主要用於處理大量資料的高訪問負載,也用於一些日誌系統等等。 |
Key 指向 Value 的索引值對,通常用hash table來實現 |
尋找速度快 |
資料無結構化,通常只被當作字串或者位元據 |
列儲存資料庫 |
Cassandra, HBase, Riak |
分布式的檔案系統 |
以列簇式儲存,將同一列資料存在一起 |
尋找速度快,可擴充性強,更容易進行分布式擴充 |
功能相對局限 |
文檔型資料庫 |
CouchDB, MongoDb |
Web應用(與Key-Value類似,Value是結構化的,不同的是資料庫能夠瞭解Value的內容) |
Key-Value對應的索引值對,Value為結構化資料 |
資料結構要求不嚴格,表結構可變,不需要像關係型資料庫一樣需要預先定義表結構 |
查詢效能不高,而且缺乏統一的查詢文法。 |
圖形(Graph)資料庫 |
Neo4J, InfoGrid, Infinite Graph |
社交網路,推薦系統等。專註於構建關係圖譜 |
圖結構 |
利用圖結構相關演算法。比如最短路徑定址,N度關係尋找等 |
很多時候需要對整個圖做計算才能得出需要的資訊,而且這種結構不太好做分布式的叢集方案。 |
1.3 MongoDB資料庫特點
MongoDB資料庫有以下特點:
l 跨平台、支援語言眾多
l 模式自由
l 支援檔案儲存體
l 易於水平擴充
l 複製集機制
l 多級索引
l 面向集合儲存
l 豐富的查詢語句
綜合以上特點,MongoDB適用於大資料量、高並發、弱事務的互連網應用。
2. MongoDB安裝
這裡主要介紹在windows平台下的安裝(其他平台的安裝請到官方下載對應的安裝介質)。
2.1 下載安裝介質
MongoDB如下: https://www.mongodb.org/downloads
下載對應的windows平台下的版本。
MongoDBVUE(視覺化檢視):http://www.mongovue.com/downloads/
2.2 安裝
下載完成之後,直接點擊安裝即可。
2.2.1 將MongoDB添加到環境變數
即將MongoDB安裝目錄的bin目錄路徑,如下所示:C:\Program Files\MongoDB\Server\3.0\bin
添加到環境變數path中去。要想檢測是否添加成功,可以在命令列裡,輸入Mongo –version查看安裝的mongodb的版本號碼,結果如所示:
2.2.2 啟動MongoDB
在啟動mongodb之前,需要先為其指定對應的Data(即資料存放區)目錄,log(日誌)目錄,目錄結構如所示:
然後在命令列裡輸入以下命令:
C:\WINDOWS\system32>mongod --dbpath D:\MangoDB\Data --logpath D:\MangoDB\Log\mongodb.log –logappend
該命令主要是為mongodb指定了資料存放區目錄和日誌目錄,在瀏覽器裡輸入:
http://localhost:27017
看到如下內容,即表明服務已經啟動了:
It looks like you are trying to access MongoDB over HTTP on the native driver port.
如果該命令視窗關閉,則該資料庫服務就停止了。但是這樣有一個問題,每次開啟服務的時候,都需要輸入這行命令,會很費事。我們有兩種方式去解決這個問題,如下:
l 將以上的命令儲存為一個bat檔案,每次啟動服務的時候點擊即可(即中所示的Start檔案)
l 將MongoDB添加到服務中去,以服務的形式啟動,如下所示:
在命令列中輸入以下命令:
C:\WINDOWS\system32>mongod --dbpath D:\MangoDB\Data --logpath D:\MangoDB\Log\mongodb.log --install --serviceName "MongoDB"
在命令列裡輸入:net start MongoDB
結果如下:
輸入:net stop MongoDB,停止服務。
3. MongoDB資料模型
MongoDB是面向集合儲存的文檔型資料庫,其基本概念與常用的關係型資料庫有所不同。
3.1 文檔
文檔是MongoDB最核心的的概念,本質上是一種類JSON的BJSON格式的資料。
BSON是在JSON的基礎上加入了一些新的資料類型,包括日期、int32,int64等。
BSON是由索引值對組成,具有輕量性、可遍曆、高效性三個特性。
3.2 集合
將一組相關的文檔放到一起就組成了集合。
文檔相當於關聯式資料庫中的一條資訊,集合就相當於關係型資料庫中的表。
3.3 資料庫
多個文檔組成集合,多個集合組成資料庫。一個MongoDB樣本可以承載多個資料庫,每個資料庫都有獨立的許可權。
3.4資料類型3.4.1 基礎資料型別 (Elementary Data Type)
Null: 空值或不存在的欄位
布爾:true或false
數實值型別:只支援int32,int64,double
字串:
位元據:可以儲存由任意位元組組成的字串
Regex:主要用於查詢。
例如:{name:/olive/},name欄位包含olive
{name:/olive/i},name欄位包含olive,且不區分大小寫
{name:/^olive/i},name欄位以olive開頭,且不區分大小寫
Js代碼
3.4.2 Date日期
Mongodb中日期是一個64位的整數
Mongodb儲存時間時,先轉化為utc時間。
3.4.3 Timestamp
Timestamp只供mongodb內部使用,用於記錄操作的詳細時間,跟date類型沒有關係
3.4.4 Objectid
Objectid由24個十六進位字元構成,每個位元組儲存兩位十六進位數字,總共需要12位元組儲存空間。
3.4.5 內嵌文檔
文檔作為鍵的值,稱之為內嵌文檔。內嵌文檔使資料不用儲存成扁平結構的索引值對,從而使資料群組織方式更加自然。
樣本:
User={“name”:”olive”,”address”:{“province”:”henan”,”city”:”zhengzhou”}}
4. MongoDB資料更新
這裡的樣本主要是使用python語言來進行示範。
引入MongoDB對應的Python的驅動,首先安裝pymongo包,在命令列裡輸入:pip install pymongo。安裝完成之後在代碼裡引用。
建立資料庫的連結:
# -*- conding:utf-8 -*-
import pymongo
import sys
reload(sys)
sys.setdefaultencoding(‘utf-8‘)
conn = pymongo.MongoClient(‘localhost‘, 27017)
db = conn.MDB//建立MDB資料庫
dt = db.users//建立users資料表
建立完成之後,可以開啟MongoVue查看已建立的資料庫、資料表如所示:
4.1 資料插入4.1.1 insert
Insert函數只能作用於一個集合,如果該集合不存在,則資料庫服務會自動建立。插入時如果沒有指定_id的欄位,則自動添加該欄位。
#insert
user0 = { ‘name‘:‘Olive‘,‘sex‘:‘male‘, ‘age‘:21 }
dt.insert(user0)
user1 = { ‘name‘:‘Tom‘,‘sex‘:‘Female‘, ‘age‘:24 }
dt.insert(user1)
user2 = { ‘name‘:‘Jack‘,‘sex‘:‘male‘, ‘age‘:25 }
dt.insert(user2)
user3 = { ‘name‘:‘Kite‘,‘sex‘:‘male‘, ‘age‘:20 }
dt.insert(user3)
在MongoVUE查看已插入的資料,如所示:
除此之外,也可以給insert方法傳入一個list參數,如下:
dt.insert([{‘name‘:‘Kobe‘,‘age‘:37},{‘name‘:‘Jim‘,‘age‘:30}])
再次查看MongoVUE,如所示(新增2條資料):
4.1.2 insert_many()
如果要大批量的插入資料也可以使用insert_many()方法,使用如下:
users = [{‘name‘: ‘Olive‘+str(i)} for i in xrange(101)]
dt.insert_many(users)
4.2 資料更新
修改聚集內的記錄:
dt.update(filter, update_field, upsert, multi )
filter : update的查詢條件
update_field:要更新的欄位、更新值(類似於sql語句中的set)
upsert:如果不存在update的記錄,true為插入,false為不插入,預設為false
muti:查出多條資料,如果為true則更新所有資料,預設為false只更新一條資料
dt.update({‘name‘:‘Olive‘},{‘$set‘:{‘age‘:100}})
$set:更新指定欄位值
用法:{ $set : { field : value } }
$unset:刪除指定欄位
用法:{ $unset : { field : 1} }
$inc:更新指定欄位的值,對指定的欄位+value
用法:{ $inc : { field : value }
4.3 資料刪除
5. MongoDB資料查詢5.1 find()5.1.1 預設無參數或者find({})則查詢所有資料。
Find({},{})
第一個{} 放where條件第二個{} 指定那些列顯示和不顯示 (0表示不顯示 1表示顯示)
5.1.2 帶有參數的查詢
user = dt.find({‘name‘:‘Olive‘})
結果如:
5.1.3 查詢運算子使用(and 查詢):$lt, $lte, $gt, $gte ,$ne
user = dt.find({‘name‘:‘Olive‘,‘age‘:{‘$lt‘:90}})
5.1.4 or查詢
user =dt.find({‘$or‘:[{‘name‘:‘Olive‘},{‘age‘:{‘$lt‘:50}}]})
5.1.5 查詢內嵌文檔的某個欄位(需要使用.號操作符):
先插入一條有內嵌欄位的文檔
dt.insert_one({‘name‘: ‘111‘,‘address‘:{‘princience‘:‘Beijing‘,‘city‘:‘Beijing‘}})
樣本如下:
user = dt.find({‘address.city‘:‘Beijing‘})
5.1.6 in(nin)查詢
user =dt.find({‘name‘:{‘$in‘:[‘Olive‘,‘Tom‘,‘Jack‘]}})
user =dt.find({‘name‘:{‘$nin‘:[‘Olive‘,‘Tom‘,‘Jack‘]}})
5.1.7 對查詢的結果進行排序:
user = dt.find().sort(‘name‘,pymongo.ASCENDING)//單個欄位
user = dt.find().sort([(‘name‘,pymongo.ASCENDING),(‘age‘,pymongo.DESCENDING)])//多個欄位
5.1.8 like查詢(mongodb支援Regex/XXX/ /^XXX/以XXX開頭)
user =dt.find({"name": /"Olive"/})
5.2 find_one()
只尋找一條資訊。
樣本:
user =dt.find_one({‘name‘:‘Olive‘})
print user[‘name‘]
結果如下:
“Olive”
關於一篇mongodb的快速上手的文章,寫到這裡基本上就結束了,希望能夠希望快速上手mongodb的朋友以協助。這篇文章的樣本都是用python+mongodb寫的,當然mongodb官方還有對其他語言的適配,這裡只是為了方便示範。有興趣的朋友可以去mongodb的官網去看一下,以便進一步的研究。
MongoDB快速上手