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