MongoDB的優(yōu)勢
? ? ? ? ? ? ? ? ? ? ? ? 1.易擴展,這也是非關系數(shù)據(jù)庫共有的優(yōu)勢
? ? ? ? ? ? ? ? ? ? ? ? 2.大數(shù)據(jù)量,高性能,非常高的讀寫性能
? ? ? ? ? ? ? ? ? ? ? ? 3.靈活的數(shù)據(jù)模型,無需事先為要存儲的數(shù)據(jù)建立字段
MongoDB的安裝
? ? ? ? ? ? ? ? ? ? ? ? ? 1.pip install mongodb
? ? ? ? ? ? ? ? ? ? ? ? ? ?2. 啟動:sudo service mongod start 或者 sudo mongod --config /usr/local/mongodb/mongodb.conf
? ? ? ? ? ? ? ? ? ? ? ? ? ? 3.停止:sudo service mongod stop
? ? ? ? ? ? ? ? ? ? ? ? ? ? 4.重啟:sudo service mongod restart
? ? ? ? ? ? ? ? ? ? ? ? ? ? 5.查看是否啟動成功:ps ajx|grep mongod
? ? ? ? ? ? ? ? ? ? ? ? ? ? 6.配置文件的位置:/etc/mongod.conf
? ? ? ? ? ? ? ? ? ? ? ? ? ? 7.默認端口:27017
? ? ? ? ? ? ? ? ? ? ? ? ? ? 8.日志的位置:/var/log/mongodb/mongod.log? ?
數(shù)據(jù)庫的命令
1.查看當前的數(shù)據(jù)庫:db
2.查看所有的數(shù)據(jù)庫:show dbs
3.切換數(shù)據(jù)庫:use 數(shù)據(jù)庫名字
4.刪除當前的數(shù)據(jù)庫:db.dropDatabase()??
集合的命令
1.不手動創(chuàng)建集合:行不存在的集合中第一次加入數(shù)據(jù)時,集合會被創(chuàng)建出來
2.手動創(chuàng)建集合:db.createCollection(name,options)
例如:db.createCollection('sub',{capped:true,size:10})
參數(shù)capped:默認為false表示不設置上限
參數(shù)size:指定文檔上限,單位為字節(jié),托超過上限,會將前面的文檔覆蓋
3.查看集合:show collections
4.刪除集合:db.集合名字.drop()
數(shù)據(jù)類型
1.Object ID:文檔ID
2.String:字符串,最常用
3.Boolean:存儲一個布爾值,true或false
4.Integer:整數(shù)可以是32位或64位
5.Double:存儲浮點值
6.Object:用于嵌入式的文檔,即一個值為一個文檔
7.Null:存儲Null值
8.Timestamp:時間戳,表示從1970-1-1到現(xiàn)在的總秒數(shù)
9.Date:存儲當前日期或時間的UNIX時間格式
10.創(chuàng)建日期語句如下:參數(shù)的格式為YYYY-MM-DD
new Date('2020-01-01')
11.每個文檔都有一個屬性:_id 保證每個文檔的唯一性
可以自己去設置_id插入文檔,如果沒有提供,那么MongDB為每個文檔提供一個獨特的_id,類型為objectID
插入
1.db.集合名字.insert(document)
例如:db.stu.insert({_id:'20200101',name:'gj',gender:1})
保存
db.集合名字.save(document)
如果文檔的_id已經(jīng)存在則修改,不存在則添加
查詢
db.集合名字.find()
更新
db.集合名稱.update(<query>,<update>,{multi:<boolean>})
query:查詢條件
update:更新操作符
multi:可選,默認是false,表示只更新找到的第一條記錄,值位true表示把滿足條件的文檔全部更新
例如:db.stu.update({name:'hr'},{name:'mnc'})?更新一條,把全部內(nèi)容替換
db.stu.update({name:'hr'},{$set:{name:'mnc'}}) 更新一條,指定一個鍵對應的值
db.stu.update({},{$set:{gender:0}},{multi:true}) 更新全部
刪除
db.集合名字.remove(<query>,{justOne:<boolean>})
query:刪除文檔的條件
justOne:設置為ture或1,則只刪除一條,默認false,表示刪除多條
比較運算符
等于:默認是等于,沒有運算符
小于:$it
小于等于:$ite
大于:$gt
大于等于:$gte
不等于:$ne
例如:db.stu.find({age:{$lte:18}})
范圍運算符
$in,$nin判斷是否在某個范圍內(nèi)
例如:db.stu.find({age:{$in:[18,28,38]}})?
邏輯運算符
and:并且,和
db.stu.find({age:{$gte:18},gender:true})
or:使用$or,值為數(shù)組
db.stu.find({$or:[{age:{$gt:18}},{gender:false}]})
高級查詢
1.db.集合名字.find({文檔條件})
2.db.集合名字.findone({文檔條件}) 只返回一條
3.db.集合名字.find({條件文檔}).pretty() 將結果格式化輸出
4.支持正則表達式:使用//或$regex編寫
例如:db.products.find({sku:/^abc/})
? ? ? ? ? ? db.products.find({sku:{$regex:'789$'}})
5.limit:用于讀取指定數(shù)量得文檔
例如:查詢2條學生信息
db.stu.find().limit(2)
6.skip:用于跳過指定數(shù)量得文檔
db.stu.find().skip(2)
可以同時使用db.stu.find().limit(3).skip(2)
7.自定義查詢
使用$where后面寫一個函數(shù),返回滿足條件得數(shù)據(jù)查詢年齡大于30得學生
db.stu.find({$where:function(){return this.age>30;}})
8.投影:在查詢到得返回結果中,只選擇必要得字段db.集合名字.find({},{字段名稱1,...})
參數(shù)為字段與值,值為1表示顯示,值為0不顯,特殊:對于_id列默認是顯示得,如果不顯示需要明確設置為0
例如:db.stu.find({},{_id:0,name:1,gender:1})
9.排序:方法sort(),用于對集進行排序
db.集合名稱.find().sort({字段:1,...})
參數(shù)1為升序,-1為降序
例如:根據(jù)性別降序,在根據(jù)年齡升序
db.stu.find().sort({gender:-1,age:1})
10.統(tǒng)計個數(shù):方法count()
db.集合名字.find({條件}).count()
db.集合名字.count({條件})
db.stu.find({gender:ture}).count()
db.stu.count({age:{$gt:20},gender:true})
數(shù)據(jù)備份和恢復
數(shù)據(jù)備份
mongodump -h dbhost -d dbname -o dbdirectory
-h:服務器地址,也可以指定端口號
-d:需要備份的數(shù)據(jù)庫名稱
-o:備份的數(shù)據(jù)存放位置,此目錄中存放著備份出來的數(shù)據(jù)
數(shù)據(jù)恢復
mongorestore -h dbhost -d dbname --dir dbdirectory
-h:服務器地址
-d:需要恢復的數(shù)據(jù)庫實例
--dir:備份數(shù)據(jù)所在位置
聚合命令
聚合是基于數(shù)據(jù)處理的聚合管道,每個文檔通過一個由多個階段組成的管道,可以對每個階段的管道進行分組,過濾等功能,然后經(jīng)過一系列的處理,輸出相應的結果
db.集合名稱.aggregate({管道:{表達式}})
常用管道命令
1.$group:將集合中的文檔分組,可用于統(tǒng)計結果
注意:1.$group對應的字典中有幾個鍵,結果中就有幾個鍵
2.分組依據(jù)需要放到'_id'后面
3.取不同的字段的值需要使用$,如'$age'
4.取字典嵌套的字典中的值的時候’$_id.country‘
5.能夠同時按照多個鍵進行分組’{$grop:{_id:{country:'$country',province:'$province'}}}‘
結果是’{_id:{country:'',province:''}}‘
按照gender進行分組,獲取不同數(shù)據(jù)的個數(shù)和平均年齡
db.stu.aggregate({$group:{_id:'$gender',count:{$sum:1},avg_age:{$avg:'$age'}}})
使用$group統(tǒng)計整個文檔
db.stu.aggregate({$group:{_id:null,count:{$sum:1},mean_age:{$avg:'age'}}})
2.$match:過濾數(shù)據(jù),只輸出符合條件的文檔
3.$project:修改輸入文檔的結構,如重命名,增加,刪除字段,創(chuàng)建計算結果
db.stu.aggregate({$group:{_id:null,count:{$sum:1},mean_age:{$avg:'age'}}},{$project:{gender:'%_id',count:1,'avg_age':1,_id:0}})
4.$sort:將輸入文檔排序后輸出
例如:查詢男生,女生人數(shù),并且按照降序排序
db.stu.aggregate{{$group:{_id:'$gender',counter:{$sum:1}}},{$sort:{counter:-1}}}
5.$limit:限制聚合管道返回的文檔數(shù)
6.$skip:跳過指定數(shù)量的文檔,并返回余下的文檔
7.$unwind:將數(shù)組類型的字段進行拆分
表達式
語法:表達式:'$列名'
1.$sum:計算總和,$sum:1 表示以一倍計數(shù)
2.$avg:計算平均值
3.$min:獲取最小值
4.$max:獲取最大值
5.$push:在結果文檔中插入值到一個數(shù)組中
6.$first:根據(jù)資源文檔的排序獲取第一個文檔數(shù)據(jù)
7.$last:根據(jù)資源文檔的排序獲取最后一個文檔數(shù)據(jù)
索引
語法:db.集合.ensureindex({屬性:1}),1表示升序,-1表示降序
例如:db.t1.ensureindex({name:1})
在默認情況下索引字段的值可以相同
創(chuàng)建唯一索引(索引的值是唯一的):
db.t1.ensureIndex({'name':1},{'unique':true})
建立聯(lián)合索引
db.t1.ensureIndex({name:1,age:1})
查看當前集合的所有索引:
db.t1.getIndexes()
刪除索引:
db.t1.dropIndex('索引名稱')
mongodb和python間交互
from pymongo import Mongoclient
client = MongoClient(host='127.0.0.1',port=27017)
collection = client['test']['t251']
插入一條數(shù)據(jù)
ret1 = collection.insert({'name':'xiaoming','age':18})
插入多條數(shù)據(jù)
data_list = [{'name':'test{}'.format(i)} for i in range(10)]
colletion.insert_many(data_list)
查詢一個記錄
t =collection.find_one({'name':'xiaowang'})
查詢多條記錄
collection.find({'name':'xiaowang'})
更新一條數(shù)據(jù)
collection.update_one({'name':'xiaowang'},{$set:{'name':'xiaohong'}})
更新全部數(shù)據(jù)
collection.update_many({'name':'xiaowang'},{'$set':{'name':'xiaohong'}})
刪除一條
collection.delete_one({'name':'xiaowang'})
刪除所有條件滿足的數(shù)據(jù)
collection.delete_many({'name':'xiaowang'})
? ??????????????