一、mongodb数据库系列——介绍和安装 简单使用 增删改查
一、Mongodb的介紹和安裝
學(xué)習(xí)目標(biāo)
1. mongodb的介紹
1.1 什么是mongodb
- mongodb 是一個(gè)功能最豐富的NoSQL非關(guān)系數(shù)據(jù)庫。由 C++ 語言編寫。
- mongodb 本身提供S端存儲(chǔ)數(shù)據(jù),即server;也提供C端操作處理(如查詢等)數(shù)據(jù),即client。
1.2 SQL和NoSQL的主要區(qū)別
- 在SQL中層級(jí)關(guān)系: 數(shù)據(jù)庫>表>數(shù)據(jù)
- 而在NoSQL中則是: 數(shù)據(jù)庫>集合>文檔
1.2.1 數(shù)據(jù)之間無關(guān)聯(lián)性
- SQL中如何需要增加外部關(guān)聯(lián)數(shù)據(jù)的話,規(guī)范化做法是在原表中增加一個(gè)外鍵,關(guān)聯(lián)外部數(shù)據(jù)表。
- NoSQL則可以把外部數(shù)據(jù)直接放到原數(shù)據(jù)集中,以提高查詢效率。缺點(diǎn)也比較明顯,對(duì)關(guān)聯(lián)數(shù)據(jù)做更新時(shí)會(huì)比較麻煩。
- SQL中在一個(gè)表中的每條數(shù)據(jù)的字段是固定的。而NoSQL中的一個(gè)集合(表)中的每條文檔(數(shù)據(jù))的key(字段)可以是互不相同的。
1.2.2 拓展閱讀
https://www.cnblogs.com/jeakeven/p/5402095.html
1.3 mongodb作為非關(guān)系型數(shù)據(jù)庫相較于關(guān)系型數(shù)據(jù)庫的優(yōu)勢(shì)
易擴(kuò)展: NoSQL數(shù)據(jù)庫種類繁多, 但是一個(gè)共同的特點(diǎn)都是去掉關(guān)系數(shù)據(jù)庫的關(guān)系型特性。 數(shù)據(jù)之間無關(guān)系, 這樣就非常容易擴(kuò)展
大數(shù)據(jù)量,高性能: NoSQL數(shù)據(jù)庫都具有非常高的讀寫性能, 尤其在大數(shù)據(jù)量下表現(xiàn)優(yōu)秀。 這得益于它的非關(guān)系性,數(shù)據(jù)庫的結(jié)構(gòu)簡(jiǎn)單
靈活的數(shù)據(jù)模型: NoSQL無需事先為要存儲(chǔ)的數(shù)據(jù)建立字段, 隨時(shí)可以存儲(chǔ)自定義的數(shù)據(jù)格式。 而在關(guān)系數(shù)據(jù)庫中, 增刪字段是一件非常麻煩的事情。 如果是非常大數(shù)據(jù)量的表, 增加字段簡(jiǎn)直就是一個(gè)噩夢(mèng)
2. mongodb的安裝
以u(píng)buntu18.04為例
mongodb具有兩種安裝方式:命令安裝 或 源碼安裝
2.1 命令安裝
在ubuntu中使用apt-get工具安裝
sudo apt-get install -y mongodb-org或參考官方文檔 https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/
2.2 源碼安裝
2.2.1 選擇相應(yīng)版本和操作系統(tǒng)并下載
https://www.mongodb.com/download-center/community?jmp=docs
2.2.2 解壓
tar -zxvf mongodb-linux-x86_64-ubuntu1804-4.0.3.tgz
2.2.3 移動(dòng)到/usr/local/目錄下
sudo mv -r mongodb-linux-x86_64-ubuntu1804-4.0.3/ /usr/local/mongodb
2.2.4 在shell的初始化腳本.bashrc中添加mongodb可執(zhí)行文件到環(huán)境變量PATH中
a. 進(jìn)入.bashrc文件中
cd ~ sudo vi .bashrcb. 在.bashrc文件的最后添加:
export PATH=/usr/local/mongodb/bin:$PATH3. mongodb的官方文檔
https://docs.mongodb.com/manual/introduction/
小結(jié)
- 易擴(kuò)展
- 高性能
- 靈活的數(shù)據(jù)字段
- sudo apt-get install -y mongodb-org
二、mongodb的簡(jiǎn)單使用
學(xué)習(xí)目標(biāo)
1. mongodb服務(wù)端的啟動(dòng)
- 默認(rèn)端口:27017
- 默認(rèn)配置文件的位置:/etc/mongod.conf
- 默認(rèn)日志的位置:/var/log/mongodb/mongod.log
mongodb服務(wù)端啟動(dòng)分別兩種方式:
- 本地測(cè)試方式的啟動(dòng)(只具有本地?cái)?shù)據(jù)增刪改查的功能)
- 生產(chǎn)環(huán)境啟動(dòng)(具有完整的全部功能)
1.1 測(cè)試方式啟動(dòng)
- 啟動(dòng): sudo service mongod start (sudo service mongod start)
- 停止: sudo service mongod stop
- 重啟: sudo service mongod restart
1.2 生產(chǎn)環(huán)境正式的啟動(dòng)方式
啟動(dòng): sudo mongod [–auth --dbpath=dbpath --logpath=logpath --append --fork] [-–f logfile ]
- 只以 sudo mongod 命令啟動(dòng)時(shí),默認(rèn)將數(shù)據(jù)存放在了 /data/db 目錄下,需要手動(dòng)創(chuàng)建
- –dbpath: 指定數(shù)據(jù)庫的存放路徑
- –logpath: 指定日志的存放路徑
- –append: 或–logappend 設(shè)置日志的寫入形式為追加模式
- –fork: 或-fork 開啟新的進(jìn)程運(yùn)行mongodb服務(wù)
- –f: 或-f 配置文件路徑(可以將上述配置信息寫入文件然后通過該文件中的參數(shù)進(jìn)行加載啟動(dòng))
- –auth: 以權(quán)限認(rèn)證的方式啟動(dòng),我們會(huì)在后邊的課程中學(xué)習(xí)該內(nèi)容
1.3 查看是否啟動(dòng)成功
ps aux | grep mongod
2. 啟動(dòng)mongodb的客戶端:進(jìn)入mongo shell
- 啟動(dòng)本地客戶端: mongo
- 查看幫助:mongo –help
- 退出:exit或者ctrl+c
3. mongodb的簡(jiǎn)單使用
開啟mongodb server的情況下,在進(jìn)入mongo shell后,就可以做簡(jiǎn)單的使用了
3.1 mongodb數(shù)據(jù)庫的命令
- 查看當(dāng)前的數(shù)據(jù)庫:db(沒有切換數(shù)據(jù)庫的情況下默認(rèn)使用test數(shù)據(jù)庫)
- 查看所有的數(shù)據(jù)庫:show dbs /show databases
- 切換數(shù)據(jù)庫:use db_name
- db_name為show dbs后返回的數(shù)據(jù)庫名
- 刪除當(dāng)前的數(shù)據(jù)庫:db.dropDatabase()
3.2 mongodb集合的命令
- 無需手動(dòng)創(chuàng)建集合:
向不存在的集合中第一次添加數(shù)據(jù)時(shí),集合會(huì)自動(dòng)被創(chuàng)建出來 - 手動(dòng)創(chuàng)建集合:
- db.createCollection(name,options)
- db.createCollection(“stu”)
- db.createCollection(“sub”, { capped : true, size : 10 } )
- 參數(shù)capped:默認(rèn)值為false表示不設(shè)置上限,值為true表示設(shè)置上限
- 參數(shù)size:集合所占用的字節(jié)數(shù)。 當(dāng)capped值為true時(shí),需要指定此參數(shù),表示上限大小,當(dāng)文檔達(dá)到上限時(shí), 會(huì)將之前的數(shù)據(jù)覆蓋,單位為字節(jié)
- 查看集合:show collections
- 刪除集合:db.集合名稱.drop()
- 檢查集合是否設(shè)定上限: db.集合名.isCapped()
3.3 簡(jiǎn)單練習(xí)
在mongo shell中輸入下列命令,查看結(jié)果
show dbs use test show collections db db.stu.insert({'name':'郭靖', 'age':22}) show dbs show collections db.stu.find() db.stu.drop() show collections db.dropDatabase() show dbs exit3.3 mongodb中常見的數(shù)據(jù)類型(了解)
3.3.1 常見類型
- Object ID: 文檔ID/數(shù)據(jù)的ID,數(shù)據(jù)的主鍵
- String: 字符串,最常用,必須是有效的UTF-8
- Boolean: 存儲(chǔ)一個(gè)布爾值,true或false
- Integer: 整數(shù)可以是32位或64位,這取決于服務(wù)器
- Double: 浮點(diǎn)數(shù)
- Arrays: 數(shù)組/列表
- Object: mongodb中的一條數(shù)據(jù)/文檔,即文檔嵌套文檔
- Null: 存儲(chǔ)null值
- Timestamp: 時(shí)間戳,表示從1970-1-1到現(xiàn)在的總秒數(shù)
- Date: 存儲(chǔ)當(dāng)前日期或時(shí)間的UNIX時(shí)間格式
3.3.2 注意點(diǎn)
-
每個(gè)文檔都有一個(gè)屬性,為_id,保證每個(gè)文檔的唯一性,mongodb默認(rèn)使用_id作為主鍵
- 可以手動(dòng)設(shè)置_id的值,如果沒有提供,那么MongoDB為每個(gè)文檔提供了一個(gè)獨(dú)特的_id, 類型為objectID
-
objectID是一個(gè)12字節(jié)的十六進(jìn)制數(shù),每個(gè)字節(jié)兩位,一共是24位的字符串:
- 前4個(gè)字節(jié)為當(dāng)前時(shí)間戳
- 接下來3個(gè)字節(jié)的機(jī)器ID
- 接下來的2個(gè)字節(jié)中MongoDB的服務(wù)進(jìn)程id
- 最后3個(gè)字節(jié)是簡(jiǎn)單的增量值
小結(jié)
- sudo mongod --dbpath=數(shù)據(jù)庫路徑
- mongo
- show dbs
- use db_name
- show collections
- db
- db.集合名.drop()
- db.dropDatabase()
- exit
三、Mongodb的的增刪改查
學(xué)習(xí)目標(biāo)
1. mongodb插入數(shù)據(jù)
命令:db.集合名稱.insert(document)
db.stu.insert({name:'gj', gender:1}) db.stu.insert({_id:"20170101", name:'gj', gender:1})插文檔時(shí),如果不指定_id參數(shù),MongoDB會(huì)為文檔自動(dòng)分配一個(gè)唯一的ObjectId
2. mongodb的保存
命令:db.集合名稱.save(document)
db.stu.save({_id:'20170101', name:'gj', gender:2}) db.stu.save({name:'gj', gender:2}) db.stu.find() use python21db.nor_col.insert([{"name" : "郭靖", "hometown" : "蒙古", "age" : 20, "gender" : true }, {"name" : "黃蓉", "hometown" : "桃花島", "age" : 18, "gender" : false }, {"name" : "華箏", "hometown" : "蒙古", "age" : 18, "gender" : false }, {"name" : "黃藥師", "hometown" : "桃花島", "age" : 40, "gender" : true }, {"name" : "段譽(yù)", "hometown" : "大理", "age" : 16, "gender" : true }, {"name" : "段王爺", "hometown" : "大理", "age" : 45, "gender" : true }, {"name" : "洪七公", "hometown" : "華箏", "age" : 18, "gender" : true }])db.nor_col.find()db.nor_col.save({_id:'5f08167af3eeea620efced4f',name:'zzz',gender:2}) db.nor_col.find()db.nor_col.save({_id:'5f081671111111111111',name:'pppp',gender:2}) db.nor_col.find()如果文檔的_id已經(jīng)存在則修改,如果_id不存在則添加
3 mongodb的查詢
命令:db.集合名稱.find()
可以使用以下數(shù)據(jù)進(jìn)行練習(xí)
db.stu.insert([{"name" : "郭靖", "hometown" : "蒙古", "age" : 20, "gender" : true }, {"name" : "黃蓉", "hometown" : "桃花島", "age" : 18, "gender" : false }, {"name" : "華箏", "hometown" : "蒙古", "age" : 18, "gender" : false }, {"name" : "黃藥師", "hometown" : "桃花島", "age" : 40, "gender" : true }, {"name" : "段譽(yù)", "hometown" : "大理", "age" : 16, "gender" : true }, {"name" : "段王爺", "hometown" : "大理", "age" : 45, "gender" : true }, {"name" : "洪七公", "hometown" : "華箏", "age" : 18, "gender" : true }])3.1 簡(jiǎn)單查詢
-
方法find(): 查詢
db.集合名稱.find({條件文檔})
-
方法findOne():查詢,只返回第一個(gè)
db.集合名稱.findOne({條件文檔})
-
方法pretty(): 將結(jié)果格式化;不能和findOne()一起使用!
db.集合名稱.find({條件文檔}).pretty()
3.2 比較運(yùn)算符
- 等于: 默認(rèn)是等于判斷, 沒有運(yùn)算符
- 小于:$lt (less than)
- 小于等于:$lte (less than equal)
- 大于:$gt (greater than)
- 大于等于:$gte
- 不等于:$ne
3.3 邏輯運(yùn)算符
邏輯運(yùn)算符主要指與、或邏輯
- and:在json中寫多個(gè)條件即可
- or:使用$or, 值為數(shù)組, 數(shù)組中每個(gè)元素為json
3.4 范圍運(yùn)算符
使用$in, $nin 判斷數(shù)據(jù)是否在某個(gè)數(shù)組內(nèi)
查詢年齡為18、 28的學(xué)生 db.stu.find({age:{$in:[18,28,38]}})3.5 支持正則表達(dá)式
使用$regex編寫正則表達(dá)式
查詢name以'黃'開頭的數(shù)據(jù) db.stu.find({name:{$regex:'^黃'}})3.6 自定義查詢
mongo shell 是一個(gè)js的執(zhí)行環(huán)境
使用$where 寫一個(gè)函數(shù), 返回滿足條件的數(shù)據(jù)
3.7 skip和limit
- 方法limit(): 用于讀取指定數(shù)量的文檔
- 方法skip(): 用于跳過指定數(shù)量的?檔
- 同時(shí)使用
注意:先使用skip在使用limit的效率要高于前者
3.8 投影
在查詢到的返回結(jié)果中, 只選擇必要的字段
命令:db.集合名稱.find({},{字段名稱:1,...})
參數(shù)為字段與值, 值為1表示顯示, 值為0不顯
特別注意:
- 對(duì)于_id列默認(rèn)是顯示的, 如果不顯示需要明確設(shè)置為0
- 對(duì)于其他不顯示的字段不能設(shè)置為0
db.stu.find({},{_id:0,name:1,gender:1})
3.9 排序
方法sort(), 用于對(duì)查詢結(jié)果按照指定的字段進(jìn)行排序
命令:db.集合名稱.find().sort({字段:1,...})
參數(shù)1為升序排列
參數(shù)-1為降序排列
3.10 統(tǒng)計(jì)個(gè)數(shù)
方法count()用于統(tǒng)計(jì)結(jié)果集中文檔條數(shù)
命令:db.集合名稱.find({條件}).count()
命令:db.集合名稱.count({條件})
去重:
對(duì)年齡為18歲的查詢記錄進(jìn)行去重:
4 mongodb的更新
db.集合名稱.update({query}, {update}, {multi: boolean})- 參數(shù)query:查詢條件
- 參數(shù)update:更新操作符
- 參數(shù)multi:可選,默認(rèn)是false,表示只更新找到的第一條數(shù)據(jù),值為true表示把滿足條件的數(shù)據(jù)全部更新
注意:“multi update only works with $ operators”
- multi參數(shù)必須和$set一起使用!
批量更新,更新查詢到的記錄:
批量更新,添加一個(gè)新的字段school:
查詢到name為zzz的記錄,相同則不做任何操作,不相同則進(jìn)行更新操作:
沒有查詢到name為hhh的記錄,所以 插入一條新的記錄:
5 mongodb的刪除
db.集合名稱.remove({query}, {justOne: boolean}) - 參數(shù)query:可選,刪除的?檔的條件 - 參數(shù)justOne:可選, 如果設(shè)為true或1,則只刪除一條,默認(rèn)false,表示刪除全部
小結(jié)
db.集合名.insert({數(shù)據(jù)})
db.集合名.save({包含_id的完整數(shù)據(jù)}) # 根據(jù)指定的_id進(jìn)行保存,存在則更新,不存在則插入
db.集合名.remove({條件}, {justOne: true/false})
db.集合名.update({條件}, {$set:{完整數(shù)據(jù)/部分字段}}, {multi: true/false})
db.集合名.find({條件}, {字段投影})
總結(jié)
以上是生活随笔為你收集整理的一、mongodb数据库系列——介绍和安装 简单使用 增删改查的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 十三、MySQL存储过程相关知识总结 +
- 下一篇: 十五、MySQL变量(系统变量、自定义变