mongod服務(wù)嚼沿、開啟估盘、關(guān)閉、重啟骡尽、
sudo service mongod start
sudo service mongod stop
sudo service mongod restart
配置文件路徑:/etc/mongod.conf
3遣妥、鏈接
mongo
mongo -h ip:port
mongo --host ip --port port
4、mongodb的操作
數(shù)據(jù)庫
查看所有數(shù)據(jù)庫:show dbs
查看當前所在數(shù)據(jù)庫:db
刪除數(shù)據(jù)庫db.dropDatabase()
查看數(shù)據(jù)庫的詳細信息: db.stats()
5攀细、集合
db.createCollection('集合名字'箫踩,屬性)
設(shè)置固定大小集合:
db.createCollection('集合名',{capped:true,size:大小,max:最大文檔數(shù)量})
刪除集合:db.集合名.drop()
6谭贪、文檔的操作
增加一條:
db.集合名.insert({key:'value'})
增加多條:
db.集合名.insert({key1:'value',key2:'value',key3:'value'})
刪除:
刪除所有文檔:
db.集合名.remove({})
刪除符合條件所有文檔:
db.集合名.remove({key:value})
刪除一條:
db.集合名.remove({key:values},{justOne:true})
修改:
更新文檔中的某些建境钟,鍵存在跟新,不存在添加
db.集合名.update({key:value},{$set:{key:value}})
全文檔更新:
db.集合名.update({key:value},{key:value})
全文檔更新:如果沒找到作為一個新文檔插入0)
db.集合名.update({key:value},{key:value})
save:
1俭识、情況:加入我們更新的文檔id存在則修改全文檔更新慨削,不存在作為新文檔插入
db.集合名.save({_id:'value',key:value,key:value,.....})
查找:
db.集合名.find({key:value})根據(jù)條件查找
限制查詢:
db.集合名.find({條件}).limit(條數(shù))#返回幾條結(jié)果
跳過查詢:
db.集合名.find({條件}).skip(num)#從幾條開始
結(jié)合使用:
db.集合名.find({條件}).skip().limit()#結(jié)果從幾條開始,返回幾條結(jié)果
自定義查詢:
db.集合名.find({$where:function(){return this.age>20}})
排序:sort 1 升序 -1 降序
db.集合名.find({條件}).sort({key:1})
投影:project 1 表示顯示 0 表示不顯示
db.集合名,find({},{name:1,_id:0})
db.集合名.find({},{name:0})
去重:distinct
db.集合名.distinct({age,{name:value}}) #查看姓名是**的人中套媚,年齡都是多大
count()#計算總和
db.集合名.find().count()
db.集合名.count({條件})
type
db.集合名.find({key:{$type:'string'}})#返回所有鍵為字符串類型的文檔
比較運算符
= db.集合名.find({age:20}).count()
小于 lte
db.集合名.find({key:{$lt:10000}}).count()#薪資小于10000有多少人
大于gte 不等于$ne
缚态、邏輯運算符、
or:[{xinzi:{$gt:10000}},{name:'小明'}]})#薪資大于10000或叫小明的人
范圍運算符
in:[19,20,30]})年齡是19堤瘤、20玫芦、30 三數(shù)任意一個
$nin 不再之內(nèi)的
正則查詢:(一定是子符串)
db.集合名.find({name:/^李.?/}) #姓李的人查出來
db.集合名.find({name:{$regex:'^李.?'}})
自定義查詢:
db.集合名.find({$where:function(){reture this.name == '李磊'}})
mongd聚合操作
project
skip
unwind
$sort
函數(shù)
avg
min
last
$first
group:{_id:'sum:1}}})#根據(jù)class分組本辐,并求出班級都有幾個
班級的平均年齡:
db.集合名.aggregate({key',avg:{age'}}})
返回班級中的年齡最大致桥帆,最小年齡
db.集合名.aggregate({key',maxage:{age'}}})
db.集合名.aggregate({key',minage:{age'}}})
push:根據(jù)班級進行分組医增,返回班級下所有的同學(xué)名字,返回的是一個數(shù)組
db.集合名.aggregate({class',names:{name}}})
last返回集合最后一個名字
db.集合名.aggregate({last:'$name'}}})
last返回集合第一個名字
db.集合名.aggregate({first:'$name'}}})
project 只返回習(xí)性名老虫、年齡
db.集合名.aggregate([{$project:{name:1,age:20,_id:0}}])
match 過濾 返回年齡在90 - 100 之間的結(jié)果
db.集合名.aggregate([{gt:90,$lt:100}}}])
sort 返回年齡在90 - 100 之間的結(jié)果 排序
db.集合名.aggregate([{gt:90,sort:{age:-1}}])
unwind:將文檔中的鍵對應(yīng)的數(shù)組叶骨,拆分成單挑獨立數(shù)據(jù)
tags:[aaa,ddd,fff]
db.集合名.aggregate([{tags'}])
跳過和限制查詢
db.集合名.aggregate([{gt:30}}},{limit:3}])
#######################8、索引
_id索引 在創(chuàng)建文檔的時候自動創(chuàng)建 (mongodb的索引都在內(nèi)存中)
普通张遭、索引:
單鍵索引
db.集合名.createIndex({key:1})
復(fù)合索引
db.集合名.createIndex({key:1,key1:-1})
子文檔索引
{students:{name:xiaoming,age:20}}
db.集合名.createIndex({'students.name':1,'students.age':-1})
db.集合名.find({'students.name':'xiaoming','students.age':20})
數(shù)組索引
db.集合名.createIndex({tags:1})
全文索引(注意:全文索引中只能創(chuàng)建一個)
db.集合名.createIndex({key:'text'})
使用他:db.集合名.find({search:'關(guān)鍵詞'}})
索引屬性:
background 在后臺創(chuàng)建索引
unique 創(chuàng)建唯一索引
name:給索引取名字
sparse 稀疏索引(如果設(shè)置了這個屬性邓萨,文檔中如果含有這個索引鍵,就創(chuàng)建菊卷,否則不創(chuàng)建)
TTL expireAfterSeconds 秒 :該屬性設(shè)置在文檔中存活的時間缔恳,超過則刪除(注意:我們直接插入一個時間,會跟文檔中真正插入的事件洁闰,相差8小時)
ttl(TTL)補充:
—id不能設(shè)置為日期索引
不能將已經(jīng)創(chuàng)建的索引修改歉甚。只能刪除,重新創(chuàng)建
TTL不能是復(fù)合索引扑眉,只能是單鍵索引
在固定的集合中不能創(chuàng)建TTL索引
刪除索引
db.集合名.dropIndex('索引名')
刪除所有索引
db.集合名.dropIndexes()
查看集合中的所有索引
db.集合名.getIndexes()
查看集合中的索引總大小
db.集合名.totalIndexSize()
強制索引
db.集合名.find({條件}).hint(‘索引名’)
索引的重建纸泄;
db.集合名.reIndex()
建立索引的注意事項、優(yōu)點腰素、缺點
優(yōu)點:相當于創(chuàng)建了一個目錄聘裁,能過提高查找的效率
缺點:對于插入,刪除弓千、修改數(shù)據(jù)會變慢衡便,因為在做修改數(shù)據(jù)時,索引也會發(fā)生變化洋访,這樣會降低效率 2镣陕、創(chuàng)建索引會產(chǎn)生額外的 數(shù)據(jù)加大對硬件的要求
會額外占用內(nèi)存
注意事項:1、盡量減少創(chuàng)建不必要的索引2姻政、經(jīng)常變動的鍵不必創(chuàng)建索引
3呆抑、不會成為查詢條件的值不需要創(chuàng)建索引 4、mongodb集合中最大索引個數(shù)不能超過64個汁展、索引的名稱不能超過128個字符鹊碍,符合索引最大值只能右31個字段
5、不能命中的索引情況nin 范圍運算符善镰,以及比較運算符 6妹萨、mongodb中索引存放在內(nèi)存中必須確保不會超過內(nèi)存
如果超過內(nèi)存最大。mongodb 會自動刪除一些索引
創(chuàng)建用戶
創(chuàng)建超級管理員
use admin
db.createUser({
'user':'username'
'pwd':'123456'
'rloes':[{role:root,db.:'admin']
})
打開mongodb的安全設(shè)置
sudo vim /etc/mongod.conf
低版本的
sudo vim /etc/mongodb.conf
高版本
sudo vim /etc/mongod.conf
修改完畢之后重置:sudo service mongod restart
使用超管登錄:
mongo -u '用戶名' -p(’密碼‘) --authenticationDatabase 'admin'
修改用戶的信息:
db.updateUser('用戶名'炫欺,{pwd:'新密碼'})
修改用戶民:
db.updateUser('用戶名',{user:‘新用戶名’})
刪除權(quán)限:
db.revokeRolesFromUser('用戶名',[{role:'權(quán)限'熏兄,db:'數(shù)據(jù)庫'}])
添加權(quán)限:
db.grantRolesToUser('用戶名'品洛,[{role:'權(quán)限',db:'數(shù)據(jù)庫'}])
1树姨、刪除用戶:
db.dropUser('用戶名')
2、刪除用戶:
db.system.users.remove('用戶名')
3桥状、查看所有用戶:
db.system.users.fond()
數(shù)據(jù)庫的備份
mongodump -h ip:端口 -d 數(shù)據(jù)庫 -o 路徑
備份集合
mongodump -h ip:端口 -d 數(shù)據(jù)庫 集合名 -o 路徑
用超級用戶進行操作
mongodump -u 'boss' -p '123456' --authenticationDatabase 'admin' -d jobs -o ~/桌面/dump/
備份所有數(shù)據(jù)庫
mongodump -h ip:端口 -o 路徑
恢復(fù)數(shù)據(jù)庫
mongorestore -h 127.0.0.1:27017 -d 數(shù)據(jù)庫名稱 --dir ~/Desktop/數(shù)據(jù)庫備份的路徑/jobs
恢復(fù)所有數(shù)據(jù)庫
mongorestore -h ip:端口 --dir 路徑
導(dǎo)出
mongoexport -d 數(shù)據(jù)庫名 -c 集合 -o 路徑/文件名.json --type json
mongoexport -d 數(shù)據(jù)庫名 -c 集合 -o 路徑/文件名.csv --type csv -f '鍵名帽揪,...'
導(dǎo)入
mongoimport -d 數(shù)據(jù)庫名 -c 集合名 --file 路徑/文件名.json --type json
mongoinport -d 數(shù)據(jù)庫名 -c 集合名 --file 路徑/文件名.csv --headerline --type csv
mongodb狀態(tài)檢測
mongostat
mongotop
mongod副本集(主從備份)
目的:防止數(shù)據(jù)災(zāi)難 、實時備份辅斟、實現(xiàn)主從數(shù)據(jù)一致性转晰、讀寫分離、無宕機行為士飒、分擔(dān)主服務(wù)器的壓力
缺點:具有中心化查邢,所有的增刪改操作都需要在主節(jié)點上完成,對主節(jié)點的壓力較大酵幕,對主機的性能要求比較高
如何實現(xiàn)副本集:
開啟mongod服務(wù)扰藕,至少兩個
mongod --bind_ip ip --port 端口號 --dapath 數(shù)據(jù)存放的路徑 --replSet rs0
例題:mongod --bind_ip 192.168.43.131 --port 27020 --dbpath ~/桌面/mongodb1 --replSet rs0
怎么鏈接?
mongo -- host ip --port 端口號
確定主服務(wù)器
rs.initiate()
添加從節(jié)點
rs.add(ip:端口號)
激活從節(jié)點
rs.slaveOk()
mongodb與python交互
監(jiān)控狀態(tài)
#service mongod start
mongostat
mongodb與pthon交互
pip3 install pymongo
import pymongo
from bson.objectid import ObjectId
創(chuàng)建mongo客戶端鏈接
mongoConn = pymongo.MongoClient('localhost',27017)
第二種
mongoConn = pymongo.MongoClient('mongodb://localhost:27017/')
第三種用用戶密碼
mongoConn = pymongo.MongoClient('mongodb://boss:123456@localhost:27017/')
操作數(shù)據(jù)庫下的集合
use_db = mongoConn.數(shù)據(jù)庫
use_db = mongoConn.mongotest
獲取數(shù)據(jù)庫下要操作的集合
use_col = use_db.class1804
文檔操作
增
def add_data():
document={
'name':'liyong',
'age':20,
'gender':'男',
'calss':'1804'
}
use_col.insert(document)
刪
def delete_data():
result = use_col.delete_one({})
#默認刪除一條
result = use_col.remove({'name':'liyong'},multi=False)
改
def update_date():
#result = use_col.update({'name':'liyong'},{'$set':{'age':30}})
#更新全部
result = use_col.update({'name':'liyong'},{'name':'lisi','age':40})
#更新多條
result = use_col.update_many({'name':'liyong'},{'name':'lisi','age':40})
#save()
#1芳撒、情況:加入我們更新的文檔id存在則修改全文檔更新邓深,不存在作為新文檔插入
resule=use_col.save({_id:'5b83725a9e3227192a28178b',address:'beijing'})
#db.集合名.save({_id:'value',key:value,key:value,.....})
result = use_col.save()
查
返回多條
def find_data():
#find_one查詢時會返回一個字典
result = use_col.find_one({'name':'liyong'})
print(result)
#跳過查詢
result = use_col.find({}).skip(2).limit(4)
if name == 'main':
add_data()
update_date()
find_data()