mongodb的常用操作命令

mongodb

安裝(你們不需要安裝,鏡像已經(jīng)存在)

Ubuntu

sudo apt-get install mongodb

Mac

brew install mongodb

啟動(dòng)

  1. 直接啟動(dòng)
sudo mongod

注意事項(xiàng):?jiǎn)?dòng)失敗

  1. 數(shù)據(jù)庫(kù)不存在 創(chuàng)建文件夾 /data/db

  2. 權(quán)限不夠,添加 sudo

  1. 啟動(dòng)參數(shù)說(shuō)明

--port 進(jìn)行設(shè)置默認(rèn)端口
--dbpath 設(shè)置數(shù)據(jù)庫(kù)路徑
--config 通過(guò)指定配置文件去啟動(dòng)mongodb,再配置文件中可以配置默認(rèn)端口、數(shù)據(jù)庫(kù)路徑等等

關(guān)閉

  1. 直接kill關(guān)閉(非常不推薦使用,最好不要使用)
sudo kill -9 進(jìn)程號(hào)
  1. 通過(guò)進(jìn)入數(shù)據(jù)庫(kù)中直接關(guān)閉
use admin
db.shutdownServer()

數(shù)據(jù)庫(kù)

顯示數(shù)據(jù)庫(kù)列表

show databases
// 或
show dbs

顯示當(dāng)前數(shù)據(jù)庫(kù)

db

進(jìn)入數(shù)據(jù)庫(kù)

use 數(shù)據(jù)庫(kù)名

創(chuàng)建數(shù)據(jù)庫(kù)

只要插入數(shù)據(jù)就自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)

刪除數(shù)據(jù)庫(kù)

// 前提
use db
// 刪除數(shù)據(jù)庫(kù)
db.dropDatabase()

集合(表)操作

創(chuàng)建集合

  1. 默認(rèn)情況下只要插入數(shù)據(jù)自動(dòng)創(chuàng)建集合
  2. 手動(dòng)創(chuàng)建集合
db.createCollection(集合名稱)

顯示集合列表

show collections

刪除集合

db.集合名.drop()

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

創(chuàng)建

// 插入數(shù)據(jù),json串
db.my_coll.insert({
    "a":"x",
    "b":{
        "q":"a",
        "p":"b"
    },
    "c":[1,2,3]
})

// _id 如果不指定 _id 自動(dòng)生成 ObjectID

// 批量插入
data = [
    {"test01":"val1"},
    {"test02":"val2"},
    {"a":{"p":"q"},"b":123}
]
db.my_coll.insertMany(data)

更新

默認(rèn)整體更新,如果需要局部更新需要使用 $set,默認(rèn)是僅更新一次,如果需要批量更新需要添加第三個(gè)參數(shù) multi

// 默認(rèn)更新是完整更新,也就是替換
db.stu.update(
    // 更新條件
    {
        "name":"郭靖"
    },
    // 更新內(nèi)容
    {
        "age":88
    }
)
// 局部更新
db.stu.update(
    // 更新條件
    {
        "name":"黃蓉"
    },
    // 更新內(nèi)容
    {
        // 局部更新內(nèi)容
        $set:{
            "age":80
        }
    }
)

// 默認(rèn)情況下是只更新一次,如果需要批量更新,添加第三個(gè)參數(shù),multi 設(shè)置為True 就是批量更新
db.stu.update(
    // 更新條件
    {
        "age":{$gt:20}
    },
    // 更新內(nèi)容
    {
        // 局部更新內(nèi)容
        $set:{
            "age":36
        }
    },
    // 更新方式
    {
        multi:true
    }
)


刪除

// 刪除
db.stu.remove(
    // 刪除條件
    {
        "age":36
    },
    // 如果想僅僅刪一條
    {
        justOne:true
    }
)

// 清空數(shù)據(jù)
db.stu.remove({})

保存

// 通過(guò) _id 查詢數(shù)據(jù)如果存在就更新,如果不存在就插入
db.my_test.save({
    "_id":1,
    "a":"b"
})

查詢

簡(jiǎn)單查詢

db.集合名.find()

復(fù)雜查詢

// 默認(rèn)查詢是 并
db.stu.find(
    // 查詢條件
    {
        "hometown":"蒙古",
        "age":20
    }
)
// 比較運(yùn)算符($gt,$gte,$lt,$lte,$ne)
db.stu.find(
    // 查詢條件
    {
        "age":{$gt:20}
    }
)

// 邏輯運(yùn)算符 $or
db.stu.find(
    // 查詢條件
    {
        "age":{$gt:20},
        $or:[
            {"hometown":"蒙古"},
            {"gender":false}
        ]
    }
)

// 范圍運(yùn)算符 $in,$nin
// 表示在列表中的
db.stu.find(
    // 查詢條件
    {
        "age":{$in:[18,45]}
    }
)

// 正則表達(dá)式
db.stu.find(
    // 查詢條件
    {
        "name":/^黃/
    }
)
db.stu.find(
    // 查詢條件
    {
        "name":{$regex:"^黃"}
    }
)

// 自定義查詢
db.stu.find(
    // 查詢條件
    {
        $where: function(){
            // 返回 true 表示符合條件
            // this 表示當(dāng)前記錄
            return this.age >= 18 && this.gender == false
        }
    }
)

高級(jí)查詢

// limit 和 skip
// 注意: 先 skip 再 limit 不管誰(shuí)先誰(shuí)后
db.stu.find().limit(2)
db.stu.find().skip(1)
db.stu.find().limit(2).skip(1)
db.stu.find().skip(1).limit(2)

// 投影 是否顯示數(shù)據(jù)
// 在不同的數(shù)據(jù)庫(kù)版本中 方式不同
db.stu.find(
    // 查詢條件
    {},
    // 投影方式,顯示數(shù)據(jù)字段
    {
        "name":1
    }
)

// 排序
// 參數(shù)1為升序排列
// 參數(shù)-1為降序排列
db.stu.find().sort(
    {
        age:-1,
        hometown:1
    }
)
// 統(tǒng)計(jì)個(gè)數(shù)
db.stu.find({條件}).count()
db.stu.count({條件}})

// 去除重復(fù)
// 第一個(gè)參數(shù)是去重的字段
// 第二個(gè)是查詢條件
db.stu.distinct('hometown',{age:{$gt:18}})

聚合,幫助我們統(tǒng)計(jì)的操作,查詢操作主要的目的是尋找數(shù)據(jù),聚合的目的統(tǒng)計(jì)數(shù)據(jù)

db.集合名稱.aggregate([ 
    {
        管道名 : {表達(dá)式}
    },
    {
        管道名 : {表達(dá)式}
    },
    {
        管道名 : {表達(dá)式}
    },
    ...
])

$group 管道

$group 就是按照字段進(jìn)行分組
指定分組的字段,字段名稱

// 基本表達(dá)式
 
// $push 表達(dá)式 
db.stu.aggregate([ 
    {
        '$group' : {
            // 指定分組字段,注意要引用數(shù)據(jù)字段必須添加 `$`
            '_id':"$gender",
            // 通過(guò)性別進(jìn)行分組,分別計(jì)算出來(lái)自的地區(qū)
            // $push 會(huì)把分組內(nèi)容某個(gè)字段放入到列表中
            // "家鄉(xiāng)列表":{$push:"$hometown"}
            // $$ROOT 表示當(dāng)前的記錄本身
            "記錄列表":{$push:"$$ROOT"}
        }
    }
]).pretty()

// $push 表達(dá)式 
db.stu.aggregate([ 
    {
        '$group' : {
            //  null 表示把所有記錄作為一組數(shù)據(jù)
            '_id':null,
            "記錄列表":{$push:"$hometown"}
        }
    }
])

match 管道,過(guò)濾數(shù)據(jù), `match` 管道的查詢條件和find的查詢條件一致的

db.stu.aggregate([ 
    {
        '$match' : {
            // 填寫過(guò)濾條件
            age:{$gt:20}
        }
    },
    {
        '$group':{
            "_id":"$gender",
            "平均年齡":{$avg:"$age"}
        }
    }
])

$project 管道,類似于投影

db.stu.aggregate([ 
    {
        '$match' : {
            // 填寫過(guò)濾條件
            age:{$gt:20}
        }
    },
    {
        '$group':{
            "_id":"$gender",
            "平均年齡":{$avg:"$age"}
        }
    },
    {
        '$project':{
            "_id":0,
            "平均年齡":1
        }
    }
])

$sort

db.stu.aggregate([ 
    {
        '$match' : {
            // 填寫過(guò)濾條件
            age:{$gt:16}
        }
    },
    {
        '$group':{
            "_id":"$hometown",
            "平均年齡":{$avg:"$age"}
        }
    },
    {
        '$sort':{
            // 1:升序
            // -1:降序
            '平均年齡':1
        }
    }
])

limit 和skip,有先后順序,誰(shuí)先誰(shuí)手按照數(shù)據(jù)流來(lái)看

db.stu.aggregate([ 
    {
        '$match' : {
            // 填寫過(guò)濾條件
            age:{$gt:16}
        }
    },
    {
        '$group':{
            "_id":"$hometown",
            "平均年齡":{$avg:"$age"}
        }
    },
    {
        '$limit':2
    }
])

db.stu.aggregate([ 
    {
        '$match' : {
            // 填寫過(guò)濾條件
            age:{$gt:16}
        }
    },
    {
        '$group':{
            "_id":"$hometown",
            "平均年齡":{$avg:"$age"}
        }
    },
    {
        '$skip':1
    }
])


db.stu.aggregate([ 
    {
        '$match' : {
            // 填寫過(guò)濾條件
            age:{$gt:16}
        }
    },
    {
        '$group':{
            "_id":"$hometown",
            "平均年齡":{$avg:"$age"}
        }
    },
    {
        '$skip':1
    },
    {
        '$limit':2
    }
])

$unwind,通過(guò)列表數(shù)據(jù)拆分?jǐn)?shù)據(jù)集

db.t2.aggregate([ 
    {
        '$unwind' : '$size'
    }
])

// 默認(rèn)情況下 $unwind 拆分?jǐn)?shù)據(jù)會(huì)過(guò)濾 空數(shù)據(jù),空列表,不存在字段
db.t3.aggregate([ 
    {
        '$unwind' : {
            // 指定拆分字段
            path:"$size",
            // 是否顯示 空數(shù)據(jù),空列表,不存在字段的數(shù)據(jù)
            preserveNullAndEmptyArrays:true
        }
    }
])

索引,提高查詢效率,缺點(diǎn):插入,更新會(huì)降低速度

// 創(chuàng)建索引
db.t1.ensureIndex({
    "name":1
})

// 查看索引列表
db.t1.getIndexes()

// 刪除索引
db.t1.dropIndex("name_1")

擴(kuò)展

  1. 服務(wù)器端會(huì)創(chuàng)建備份腳本
# mysql 備份說(shuō)明
mysqldump -uroot -p123456 數(shù)據(jù)名 | gzip > /data/backup/bks/cslized_$(date +%Y%m%d_%H%M%S).sql.gz

# mongodb
mongodump -h dbhost -d dbname -o dbdirectory | gzip > /data/backup/bks/cslized_$(date +%Y%m%d_%H%M%S).sql.gz

  1. 通過(guò) corntab 定時(shí)執(zhí)行腳本實(shí)現(xiàn)備份
    注意: 不要手動(dòng) 拷貝 復(fù)制

啟動(dòng)用戶驗(yàn)證模式

啟動(dòng)方式

  1. --auth參數(shù)啟動(dòng)
  2. 通過(guò)配置文件添加 auth=true

驗(yàn)證模式

  1. 必須要有賬號(hào)
// 如果當(dāng)前mongodb中沒有任何賬號(hào)第一步先創(chuàng)建 root 賬號(hào)
use admin
// 創(chuàng)建root賬號(hào),一旦創(chuàng)建成功之后,就無(wú)法再創(chuàng)建,
db.createUser({
    "user":"python",
    "pwd":"123456",
    roles:["root"]
})
  1. 先要進(jìn)行登錄
use admin
db.auth('python','123456')
  1. 創(chuàng)建普通賬號(hào)
db.createUser({
    "user":"db_01",
    "pwd":"123456",
    roles:[
        {
            // 對(duì)哪個(gè)數(shù)據(jù)庫(kù)
            "db":"db_01",
            // 權(quán)限 read,write,readWrite
            "role":"readWrite"
        }
    ]
})

db.createUser({
    "user":"db_02",
    "pwd":"123456",
    roles:[
        {
            // 對(duì)哪個(gè)數(shù)據(jù)庫(kù)
            "db":"db_02",
            // 權(quán)限 read,write,readWrite
            "role":"readWrite"
        }
    ]
})

  1. 刪除用戶
use admin
db.dropUser('用戶名')
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 2018-3-6 雨越下越大,什么時(shí)候能停下來(lái),抬頭看看天空,雨似斷了線的珠子。 此刻的想法是雨停了帶豆豆去超市采...
    江雪萍閱讀 439評(píng)論 0 0
  • 星期五,晴 夜里丸子挺安靜,早上起來(lái)看它拉在了廁所邊,兩次,不知為什么從昨晚開始就不用塑料廁所里拉屎了,還撕那里的...
    白羅漢閱讀 135評(píng)論 0 0
  • github最大的痛點(diǎn)在于,拿到開源項(xiàng)目不會(huì)用,導(dǎo)入各種報(bào)錯(cuò),readme看不懂,推薦給大家一個(gè)鏈接,所有的 項(xiàng)目...
    這個(gè)碼農(nóng)不太牛閱讀 146評(píng)論 0 0
  • 這回要?jiǎng)诱娓竦牧耍?!壓力山?---畢竟是個(gè)門外漢,啥都不懂。所以,一開始就要發(fā)揮黃金三問的威力:是什么?為什么?...
    荊竺閱讀 326評(píng)論 0 5

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