mongodb簡單實用

安裝

  • 在線安裝:
sudo apt-get -y mongodb-org
  • deb源碼安裝:
sudo dpkg -i package.deb
  • 源碼安裝
  1. tar -zxvf xxxx.taz
  2. sudo mv -r xxxx /usr/local/mongodb
  3. sudo vim .bashrc
  4. export PATH=/usr/local/mongodb/bin:$PATH

服務(wù)啟動停止

  • 默認(rèn)端口:27017
  • 配置文件:/etc/mongod.conf
  • 默認(rèn)日志:/var/log/mongodb/mongod.log
  • 查看狀態(tài):ps aux|grep mongod
  • 查看配置:gerp -v '#' /etc/mongod.conf
  • 強殺:ps aux|grep mongod 查看進程號,然后sudo kill 進程號

測試啟動停止

sudo service mongod start
sudo service mongod stop
sudo service mongod restart

生產(chǎn)啟動停止

參數(shù)說明

  • sudo mongod 啟動時,數(shù)據(jù)默認(rèn)存在/data/db下,文件需要手動創(chuàng)建
  • --dbpath:數(shù)據(jù)存放路經(jīng) ,使用:sudo mongod --dbpath=/home/data/aaaa
  • --logpath:日志路徑
  • --append或--logappend:設(shè)置日志寫入行為為追加
  • --fork或-fork:開啟新的進程運行mongodb服務(wù)
  • --f或者-f:配置文件路徑 sudo mongod -f /aa/mongo.conf
  • --auth:權(quán)限認(rèn)證方式啟動

自定義配置文件

dbpath=/home/zhangyu/mymongo/db
logpath=/home/zhangyu/mymongo/mymongo.log
logappend=true
fork=true

客戶端啟動停止

  • 打開:mongo
  • 退出:control+c 或者 exit

數(shù)據(jù)庫操作

  • 查看當(dāng)前數(shù)據(jù)庫:db(默認(rèn)就是test數(shù)據(jù)庫)
  • 查看所有磁盤上的庫(內(nèi)存中的不算):show dbs或者 show database
  • 切換數(shù)據(jù)庫:use 數(shù)據(jù)庫名
  • 刪除當(dāng)前所在數(shù)據(jù)庫:db.dropDatabase()

集和操作

  • 查看集和列表:show collections
  • 創(chuàng)建集和:db.createCollection("集和名",{capped:true,size:10})
  • 兩個判斷集和屬性的方法:db.集合名.isCapped
    • iscapped==true時,表示此集合設(shè)置上限
    • size設(shè)置小于256時,系統(tǒng)自動分配256,大于256時,才是用戶設(shè)置的
  • 插入數(shù)據(jù):db.集合名.insert({"name":"chai","age":"18"})
  • 查找集和中的數(shù)據(jù):db.集合名.find()
  • 集合固定大小后,查詢快,插入值不允許被修改
  • 刪除集合:db.集合名.drop()

數(shù)據(jù)類型

  • object ID:主鍵
  • String:字符串
  • Boolean:true和false
  • Integer:整數(shù)
  • Double:浮點
  • Array:數(shù)組
  • Object:mongodb中的一條數(shù)據(jù)
  • Timestamp:時間戳
  • Date:UNIX時間格式
  • Null:存儲null值
  • ??objectid在集合內(nèi)唯一

增刪改查

  • 批量插入:db.集合名.insert([{},{}])
  • 保存:
    • 先校驗objid,如果有則檢查數(shù)據(jù),數(shù)據(jù)一致就跳過,否則覆蓋掉原來數(shù)據(jù),如果id也沒有,則新增一條數(shù)據(jù):db.集合名.save({_id:"aaa",name:"fuck"})

db.集合名.find()
db.集合名.findOne()
db.集和名.find().pretty() //美化輸出

運算符

  • $lt:小于
  • $lte:小于等于
  • $gt:大于
  • $gte:大于等于
  • $ne:不等于
    例如:查詢大于18歲的所有學(xué)生
db.stu.find({age:{$gt:18}})

條件運算

  • 和:以下兩種都可以:
db.stu.find({age:{$gt:18}},gender:true)
db.stu.find($and[{age:{$gt:18}},{gender:true}])
  • 或:和上述內(nèi)容一樣,關(guān)鍵字改成or即可

范圍運算

  • $in:在范圍中:
db.stu.find({age:{$in:[18,19,20]}})
  • $nin:查找不在其中的,和上面用法一樣

正則

查詢開頭是“黃”的數(shù)據(jù):

db.stu.find({name:{$regex:'^黃'}})

自定義查詢

db.stu.find({$where:
    function(){
        this.age > 18
    }
)

查詢結(jié)果操作

  • limit:限制查詢條數(shù)
db.stu.find().limit(1)
  • skip:跳過查詢結(jié)果中的n條
db.stu.find().skip(1) //跳過一條查詢結(jié)果

skip和limit配合可制作分頁邏輯:

db.stu.find().skip(0).limit(10) // 第一頁
db.stu.find().skip(10).limit(10) // 第二頁

??:skip和limit配合時候不論誰先寫前面,都是skip先起效果

  • 投影:在查詢結(jié)果里只顯示想看的字段
db.stu.find({},{name:1,age:1}) //不想看的不寫即可,不能寫xxx:0【objid可以寫0】
  • 排序
db.stu.find().sort({age:1})//1升序,-1降序
  • 統(tǒng)計個數(shù)
db.stu.find().count()
db.stu.count()
db.stu.count({age:19})
db.stu.find({age:18}).count()
  • 去重
db.stu.distinct("hometown") // 不重復(fù)的展示出鄉(xiāng)村列表
db.stu.distinct("hometown",{age:18}) //查詢結(jié)果去重

基礎(chǔ)格式:

//query:查詢條件
//update:修改內(nèi)容
//muti:false:只更新第一條(默認(rèn)),否則更新全部
db.stu.update({query},{update},{muti:boolean}) 

實例:

# 把一班所有的數(shù)據(jù)的飯全改為屎,且覆蓋整條文檔
db.stu.update({class:"1"},{eat:"shit"})
# 只會把一班對應(yīng)的吃這個key修改,該條文檔其他值不變
db.stu.update({class:"1"},{$set:{eat:"shit"}})
# 更新多條,注意:用muti時必須使用$set
db.stu.update({class:"1"},{$set{eat:"shit"}},{muti:true})

upsert操作

功能為:找到就修改,找不到就新增一條數(shù)據(jù)

db.stu.update({name:"laotou"},{$set{eat:"shit"}},{upsert:true})

刪除

# 刪除全部符合條件的
db.stu.remove({name:"laotou"},{justOne:false})

聚合操作

使用aggregate函數(shù),常用的是group管道

# 每一個大括號都是一個管道
db.stu.aggregate({},{},...)
  • _id:使用鍵進行分組
# 使用gender的值將數(shù)據(jù)分組
db.stu.aggregate({$group:{_id:"$gender"}})
# 根據(jù)gender分組后,顯示數(shù)據(jù)里增加一個計數(shù)器顯示,表達式為累加,每次+1,??:不能是0
db.stu.aggregate({$group:{_id:"$gender",counter:{$sum:1}}})

??:除了_id,其他的鍵都可以自己定義,然后被顯示在結(jié)果中

  • 分組求和(和上面的是一個體系的):
# 注意sum的值不是1了,而是求和的依據(jù)是哪個key
db.stu.aggregate({$group:{_id:"$gender",age_sum:{$sum:"$age"}}})
  • 求平均數(shù)
# 和求和一個意思
db.stu.aggregate({$group:{_id:"$gender",avg_age:{$avg:"$age"}}})
  • 在分組結(jié)果里構(gòu)建一個數(shù)據(jù)組
db.stu.aggregate({$group:{_id:"$gender",name_list:{$push:"$name"}}})
  • 常用表達式總結(jié)
  1. sum:計算綜合,sum:1每次+1
  2. $avg:平均值
  3. $max:獲取最大值
  4. $push:在結(jié)果集中,插入值到數(shù)組中
  • 其他騷操作:不分組但使用分組函數(shù)
# 不分組,但計算總數(shù)量
db.stu.aggregte({$group:{_id:null,counter:{$sum:1}}})

match管道

用法非常簡單

# 找出18歲的人,進行性別分組
db.stu.aggregate({$match:{age:18}},{$group:{_id:"$gender"}})
# 模糊匹配"黃",然后再分組
db.stu.aggregate({$match:{name:/黃/}},{$group:{_id:"$gender"}})

project管道

相當(dāng)于投影(select key1 key2 .....)


# ??投影的key可以是分組時構(gòu)造出的新名字喲!??!
db.stu.aggregate({$group:{_id:"gender",avg_age:{$avg:"$age"}}},{$project:{avg_age:1}})

sort管道

# 1:升序,-1:降序
db.stu.aggregate({$sort:{age:1}})

limit和skip管道

??:由于管道的執(zhí)行有先后順序,所以這里的limt和skip不能用來分頁,分完就亂套了,當(dāng)然如果想強行裝逼也可以用。

# 先找到10條,再跳過兩條
db.stu.aggregate({$limt:10},{$skip:2})

拆分管道

如果有的字段對應(yīng)一個數(shù)組,可以根據(jù)這個數(shù)組將一條數(shù)據(jù)拆分開

# 根據(jù)size拆分,不展示異常數(shù)據(jù)
db.stu.aggregate({$unwind:"$size"})

# 根據(jù)size拆分,并且展示沒有size屬性和有屬性但沒有值的數(shù)據(jù)
db.stu.aggregate({$unwind:{path:"$size",preserveNullAndEmptyArrays:true}})

索引

??查詢頻繁的時候需要使用索引,增刪改頻繁時不要用索引

  • 簡單創(chuàng)建:
# 1升序,-1降序
db.集合名.ensureIndex({屬性:1})
  • 唯一索引創(chuàng)建
# 之后num對應(yīng)的value不能再有相同的值了
db.stu.ensureIndex({num:1},{unique:true})
  • 創(chuàng)建符合索引
db.集合名.ensureIndex({屬性:1,卡卡卡:1})
  • TIPS
  • 創(chuàng)建10000條測試數(shù)據(jù):
for(int i = 0;i<10000;i++)> {db.stu.insert({name:'test'+i,age:i})}
  • 展示某數(shù)據(jù)執(zhí)行的詳細(xì)信息
db.find({age:9999}).explain("executionStats")
  • 獲取索引
db.stu.getIndexes()
  • 刪除索引
# 利用屬性名
db.stu.dropIndex({age:1})
# 利用索引名
db.stu.dropIndex('age_1')

權(quán)限管理

mongodb默認(rèn)沒有設(shè)置管理員,需要手動添加

  1. 開啟驗證
    在mongo.conf中添加auth=true
  2. 添加賬號
    ??:賬號創(chuàng)建在哪個數(shù)據(jù)庫中,就只能登陸哪個數(shù)據(jù)庫
    ??:超管只能創(chuàng)建在admnin數(shù)據(jù)庫里
  • 超管
# 使用超管
use admin
# 創(chuàng)建用戶
db.createUser({user:"zhangyu",pwd:"123456",roles:['root']})
# 登陸
db.auth("zhangyu","123456")
  • 創(chuàng)建普通用戶
db.createUser({user:"zhangyu",pwd:"123456",roles:['readWrite']})
show users # 查看這個庫里的用戶賬號
  • 將所有賬號都創(chuàng)建在admin里,并且統(tǒng)一管理
db.createUser({user:"zhangyu",pwd:"123456",roles:[{db:"庫1",role:"read"},{db:"庫2",role:"readWrite"}]})
  • 刪除用戶(必須登錄用戶admin)
db.dropUser("zhangyu")

mongodb與python交互

登錄

pip3 install pymongo
  • 普通登錄
from pymongo import MongoClient
client = MongoClient('120.1.1.1',27017)
collection = client[db名][集和名]
  • 認(rèn)證登錄
# 認(rèn)證方式1(不推薦,但仍然可用)
from urllib.parse import quote_plus
user = "zhangyu"
pass = "123456"
host = "129.3.3.4"
port = "27017"
# quote可以對字符串進行編碼
uri = "mongodb://%s:%s@%s" % (quote_plus(user),quote_plus(password),host)
client = MongoClient(uri,port=port)
collection = client.db名.集和名

# 認(rèn)證方式2(推薦)
db=client["admin"]
db.authenticate("zhangyu","123456")
collection = client["庫"]["集和"]

集和操作

插入

# 單條插入
col.insert({username:"zhangyu"})
# 多條插入
col.insert([{username:"zhangyu"},{username:"zhangyu2"}])

查詢

# 條件查詢
for data in collection.find({條件})
    print(data)
# 查詢一條
collection.find_one()

更新

  • 覆蓋更新
# 第一個為查詢條件,第二個為更新數(shù)據(jù)
col.update({"class":"zhangyu"},{"age":"18"})
  • 按key更新
# 按key更新一條
col.update({},{"$set":{"id":"dddd"}})
# 按key更新多條
col.update({},{"$set":{"id":"dddd"}},muti=True)
# upsert操作
col.update({"查詢的key":"查詢的value"},{"$set":{"id":"dddd"}},upsert=True)

刪除

  • 刪除單條
col.delete_one({"name":"zhangyu"})
  • 刪除多條
col.delete_many({"gender":"1"})
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 客戶端https://robomongo.org/ 連接mongodb://[username:password@...
    加勒比兔Z閱讀 380評論 0 0
  • 知識點:美化輸出:db.stu.find().pretty() $project:修改輸入文檔的結(jié)構(gòu)??梢杂脕碇孛?..
    胖虎很可愛閱讀 811評論 0 1
  • 簡介 MongoDB 是一個基于分布式文件存儲的NoSQL數(shù)據(jù)庫 由C++語言編寫,運行穩(wěn)定,性能高 旨在為 WE...
    大熊_7d48閱讀 37,864評論 1 9
  • 簡介 NoSQL : 全名為Not Only SQL, 指的是非關(guān)系型的數(shù)據(jù)庫 隨著訪問量上升, 網(wǎng)站的數(shù)據(jù)庫性能...
    奮斗的老王閱讀 3,136評論 4 47
  • 1. MongoDB 簡介 MongoDB是一個可擴展的高性能,開源,模式自由,面向文檔的NoSQL,基于分布式文...
    rhlp閱讀 1,214評論 0 3

友情鏈接更多精彩內(nèi)容