傳統(tǒng)的數(shù)據(jù)存儲都是基于關系數(shù)據(jù)庫管理系統(tǒng)(RDBMS)進行管理,隨著web應用數(shù)據(jù)量的爆炸式增長對高并發(fā)和查找效率提出更高的要求可婶,而傳統(tǒng)的數(shù)據(jù)庫注重數(shù)據(jù)關系的構建缺乏靈活性在一些場合下效率較低啼辣,如在部分商品應用中添加字段需要對整個表已有的數(shù)據(jù)進行操作資源消耗極大古今,若重新建表來專表專用使后期管理變得復雜。現(xiàn)在互聯(lián)網上的數(shù)據(jù)產生快且形態(tài)各異摆尝,NoSQL(No Only SQL)應運而生解決超大規(guī)模無固定模式數(shù)據(jù)的存儲多艇。其中MongoDB作為文檔型數(shù)據(jù)庫的典型代表,是一個基于分布式文件存儲的開源數(shù)據(jù)庫系統(tǒng)旨在為WEB應用提供可擴展的高性能數(shù)據(jù)存儲解決方案像吻。
MongoDB的基本結構:MongoDB由數(shù)據(jù)庫峻黍、集合和文檔三級結構構成复隆,對應SQL中的數(shù)據(jù)庫、表姆涩、記錄挽拂,一個集合包含多個文檔對象,文檔對象以JSON格式寫成骨饿。
開始MongoDB
- 設置MongoDB數(shù)據(jù)庫的存儲路徑 mongod -- dbpath E:\data\db(需要提前建好)
- 啟動MongoDB服務器:mongod
啟動后會在數(shù)據(jù)庫存儲位置(E:\data\db)產生一系列文件亏栈,不要手動修改 - 修改默認端口:mongod --port 27017(默認)
- 鏈接MongoDB數(shù)據(jù)庫:mongo
- 查看所有數(shù)據(jù)庫:show dbs
- 切換到指定數(shù)據(jù)庫:use xxx
- 查看當前操作的數(shù)據(jù)庫:db
- 查看當前數(shù)據(jù)庫中所有的集合:show collections
當數(shù)據(jù)庫和集合名不存在時,可以直接操作自動生成
數(shù)據(jù)庫的CRUD操作
增加文檔
# 插入一條數(shù)據(jù)自動生成_id屬性
db.collectionName.insertOne( {} )
# 插入多條數(shù)據(jù)用數(shù)組包裹
db.collectionName.insertMany( [ {} , {} ] )
查詢數(shù)據(jù)
# 查詢一個文檔宏赘,返回一個文檔對象
db.collectionName.findOne({條件})
# 查詢多個對象绒北,返回以數(shù)組組織的多個文檔對象
db.collectionName.find({})
# 內嵌文檔某一項作為查詢條件用.進行索引,查詢key需要用“”
{
name:'liu',
hobby:{
movies:['movie1','movie2'],
cities:['zhuhai','chengdu']
}
}
db.users.find({"hobby.movies":'movie1'})
查詢操作符
當查詢的某一屬性是在一個范圍內的文檔察署,可以用mongo提供的比較操作符
#查詢操作符的使用
#比較操作符
$gt 大于
$gte 大于等于
$lt 小于
$lte 小于等于
$ne 不等于
$eq 等于的另一種寫法
db.users.find({num:{$gt:200}}) #大于200
db.users.find({num:{$gt:200,$lt:300}}) #大于200小于300
$or 或者
db.users.find(
{
$or:[
{num:{$gt:300}},
{num:{$lt:200}}
]
}
) #大于300或小于200
限制條數(shù)和分頁
限定展示N條出來的查找結果條數(shù)可以用limit(N)函數(shù)闷游,跳過前N條結果可以用skip(N)函數(shù),利用這兩個函數(shù)便可以實現(xiàn)搜索引擎中分頁展示的功能贴汪。
db.users.find().skip(頁碼-1 * 每頁顯示的條數(shù)).limit(每頁顯示的條數(shù))
db.users.find().limit(10) #前10條數(shù)據(jù)
db.users.find().skip(50).limit(10) #跳過前50條數(shù)據(jù)脐往,即查詢的是第61-70條數(shù)據(jù),即第6頁的數(shù)據(jù)
結果排序
未指定排序鍵的時候默認用主鍵排序扳埂,可以將查詢結果以某一特殊鍵進行排序业簿。
db.emp.find().sort({sal:1}) #1表示升序排列,-1表示降序排列
db.emp.find().sort({sal:1,empno:-1}) #先按照sal升序排列阳懂,如果遇到相同的sal梅尤,則按empno降序排列
注意:skip,limit,sort可以以任意的順序調用,最終的結果都是先調sort希太,再調skip克饶,最后調limit
投影展示
查詢到的結果都會以整個文檔進行顯示,可以選取某幾個字段顯示誊辉,_id字段默認顯示矾湃。
db.emp.find({},{ename:1,_id:0})#在匹配到的文檔中只顯示ename字段
修改數(shù)據(jù)
利用修改操作符針對滿足某一條件的文檔的部分屬性進行修改,常用的操作符有unset,
addToSet堕澄,不加修改操作符則會直接索引新對象邀跃。
# 1.替換整個文檔
# db.collectionName.update(condiction,newDocument)
> db.students.update({_id:'222'},{name:'kang'})
# 2.修改對應的屬性,需要用到修改操作符蛙紫,比如$set,$unset,$push,$addToSet
db.collectionName.update(
# 查詢條件
{_id:222},
{
#修改對應的屬性
$set:{
name:'kang2',
age:21
}
#刪除對應的屬性
$unset:{
gender:1 //這里的1可以隨便改為其他的值拍屑,無影響
}
}
)
# 3.update默認與updateOne()等效,即對于匹配到的文檔只更改其中的第一個
# updateMany()可以用來更改匹配到的所有文檔
db.students.updateMany(
{name:'liu'},
{
$set:{
age:21,
gender:222
}
}
)
# 4.向數(shù)組中添加數(shù)據(jù)
db.users.update({username:'liu'},{$push:{"hobby.movies":'movie4'}})
#如果數(shù)據(jù)已經存在坑傅,則不會添加
db.users.update({username:'liu'},{$addToSet:{"hobby.movies":'movie4'}})
# 5.自增自減操作符$inc
{$inc:{num:100}} #讓num自增100
{$inc:{num:-100}} #讓num自減100
db.emp.updateMany({sal:{$lt:1000}},{$inc:{sal:400}}) #給工資低于1000的員工增加400的工資
刪除文檔
# 刪除文檔
db.collectionName.deleteOne()
db.collectionName.deleteMany()
# 刪除集合
db.collection.drop()
# 刪除數(shù)據(jù)庫
db.dropDatabase()
pymongo
pymongo是Python用于操控MongoDB的庫僵驰,將MongoDB的操作指令進行函數(shù)封裝,函數(shù)名是指令名按單詞用_隔開。
import pymongo
#創(chuàng)建鏈接
client = pymongo.MongoClient('localhost',27017)
# 創(chuàng)建數(shù)據(jù)庫(存在則選用)
book_weather = client['weather']
# 創(chuàng)建集合(存在則選用)
sheet_weather = book_weather['sheet_weather_1']
更多操作可以詳見開發(fā)文檔