MongoDB數據庫
1. MongoDB介紹
MongoDB是⼀個基於分佈式⽂件存儲的nosql數據庫。在處理⼤數據的時候會⽐MySQL更有優勢。爬⾍的數據如果上了⼀個量級,可能⽤MongoDB會⽐MySQL更好
1-1. MongoDB優勢
- ⽆數據結構限制
- 沒有表結構的概念,每條記錄可以有完全不同的結構
- 業務開發⽅便快捷
{name:'⼩明',sex:'男'}
{name:'居然',address:'東北'}
{name:'⼩紅',home:[{'⼭東'},{江⻄}]}
-
冗餘與擴展
- 複製集保證數據安全
- 分⽚擴展數據規模
-
良好的⽀持
- 完善的⽂檔
- ⻬全的驅動⽀持
1-2. 安裝
1-2-1. 在Ubuntu中安裝
- 在Linux中安裝MongoDB
sudo apt-get install mongodb
- 開啓服務
sudo service mongodb start
- 關閉服務
sudo service mongodb stop
- 重啓服務
sudo service mongodb restart
注意:
如果是系統⾮正常關閉,這樣啓動會報錯,由於mongodb⾃動被鎖上了,這是需要進⼊mongodb數據庫⽂件所在的⽬錄(/var/lib/mongodb/),刪除⽬錄中的mongodb.lock⽂件,然後再進⾏上述操作。
遠程連接:
需要修改 /etc/mongodb.conf
打開⽂件:
sudo vim /etc/mongodb.conf
註釋掉 bind 127.0.0.1
1-2-2. 在Windows中安裝
下載網址:https://www.mongodb.com/download-center/community
安裝MongoDB:https://www.cnblogs.com/chy18883701161/p/11100560.html
運行MongoDB:
- 把MongoDB的bin⽬錄加⼊到環境變量中
- 執⾏命令
mongod --dbpath D:\MongoDB\data(路徑) # 啓動
連接MongoDB:
在環境變量設置好的前提下,使⽤以下命令mongo就可以進⼊到mongo的操作終端了
1-3. MongoDB概念介紹
SQL概念 | MongoDB概念 | 解釋 |
---|---|---|
database | database | 數據庫 |
table | collection | 數據庫表/集合 |
row | document | 數據記錄行/文檔 |
column | field | 字段/域 |
index | index | 索引 |
primary key | primary key | 主鍵 |
1-4. MongoDB三元素
三元素: 數據庫、集合、文檔
- 文檔:就是關係型數據庫中的⼀⾏。⽂檔是⼀個對象,由鍵值對構成,是json的擴展形式
{"name": "abc", "gender": 1}
- 集合:就是關係型數據庫中的表。可以存儲多個⽂檔,結構可以不固定。
{"name": "abc", "gender": 1}
{"name": "abc", "age": 18}
{"title": "abc", "price": 1}
2. MongoDB的基本使用
2-1. 查找數據庫
show dbs
2-2. 切換數據庫
use 數據庫
2-3. 查看當前的數據庫
db
2-4. 刪除數據庫
db.dropDatabase()
2-5. 創建數據庫
use 數據庫 // 當有數據同時存入的時候,會自動創建
2-6. 查看集合
show tables
show collections
2-7. 退出數據庫
db.shutdownServer() //下次使用需要重啓服務
3. MongoDB中集合的基礎命令
3-1. 注意:
不⼿動創建集合,向不存在的集合中第⼀次加⼊數據時,集合會被創建出來!!!!
3-2. 手動創建集合
db.createCollection(name,options)
- name: 要創建的集合名稱
- options: 可選參數, 指定有關內存⼤⼩及索引的選項
db.createCollection('sub',{capped:true,size:10})
- 參數capped:默認值爲false表示不設置上限,值爲true表示設置上限
- 參數size:當capped值爲true時,需要制定此參數。表示上限⼤⼩,當⽂檔達到上限時,會將之前的數據覆蓋,單位爲字節
3-3. 查看集合
show collections
3-4. 刪除集合
db.集合名稱.drop()
4. MongoDB中的數據類型
- String:字符串,必須是有效的UTF-8
- Boolean:存儲⼀個布爾值,true或者false
- Integer:整數可以是32位或64位,這取決於服務器
- Double:存儲浮點數
- Arrays:數組或列表
- Object:嵌⼊式⽂檔
- Null:存儲Null值Timestamp:時間戳, 表示從1970-1-1到現在的總秒數
- Object ID是⼀個12字節的⼗六進制數
- 前4個字節爲當前時間戳
- 接下來3個字節的機器ID
- 接下來的2個字節中MongoDB的服務進程id
- 最後3個字節是簡單的增量值
5. MongoDB的增刪改查
5-1. 命名規範
- 不能是空字符串
- 不得含有特殊字符
- 應全部⼩寫
- 最多64個字節
- 數據庫名不能與現有系統保留庫同名,如admin,local
5-2. 插入數據(增)
db.集合名.insert({}) 數據格式爲json,id不能重複,⽀持多條插⼊數據庫
db.集合名.save({數據})
5-2-1. 單條插入數據
db.name_collection.insert({x:1})
5-2-2. 多條插入數據
// 插入3<=i<10的數據
for(i=3;i<10;i++)db.name_collection.insert({x:i})
5-3. 查詢數據(查)
5-3-1. 查詢所有數據
db.name_collection.find({條件⽂檔})
5-3-2. ⽅法pretty():將結果格式化
db.集合名稱.find({條件⽂檔}).pretty()
5-3-3. 查詢單條數據
db.name_collection.findOne({條件⽂檔})
5-3-4. 查出的數據求總數
db.name_collection.find().count()
5-3-5. limit和skip
limit⽤於讀取指定數量的⽂檔
db.name_collection.find().limit(2)
skip⽤於跳過指定數量的⽂檔
db.name_collection.find().skip(2)
limit和skip同時使⽤
db.name_collection.find().skip(2).limit(2)
5-3-6. 映射
指定返回的字段,如果爲1則返回改字段,如果爲0則除了改字段外所有字段返回。id如果沒寫會默認返回
db.name_collection.find({},{_id:1})
5-3-7. 排序
// 按照年齡升序排序
db.name_collection().find().sort({age:1})
// 按照年齡降序排序
db.name_collection().find().sort({age:-1})
5-3-8. 帶有條件的查詢
// 查詢x等於100的數據
db.name_collection.find({x:100})
// 查詢x等於100,y等於99的
db.name_collection.find({x:100,y:99})
5-4. 修改數據(改)
db.集合名字.update({條件},{更新的數據})
db.集合名字.update({條件},{$set:{更新的數據}})
db.集合名字.update({條件},{$set:{更新的數據}},{multi:true})
5-5. 刪除數據(刪)
db.集合名.remove() // 刪除所有數據,索引不會刪除
db.集合名.remove({x:100}) // 刪除滿足條件的
5-6. MongoDB常見運算符
5-6-1. 比較運算符
符號 | 解釋 |
---|---|
等於 | 默認是等於判斷,沒有運算符 |
$lt | 小於 |
$lte | 小於等於 |
$gt | 大於 |
$gte | 大於等於 |
查詢示例:
db.集合名.find({y:{$gte:18}}) // 查詢大於等於18的數據
5-6-2. 範圍運算符
符號 | 解釋 |
---|---|
$in | 是 |
$nin | 否 |
db.集合名.find({age:{$in:[18,28]}}) //
5-6-3. 邏輯運算符
or:使⽤$or,值爲數組,數組中每個元素爲json
db.集合名.find({$or:[{age:{$gt:18}},{gender:false}]})
6. MongoDB中的聚合命令
6-1. 介紹
聚合是基於數據處理的聚合管道,每個⽂檔通過⼀個由多個階段組成的管道,可以對每個階段的管道進⾏分組、過濾等功能,然後經過⼀系列的處理,輸出相應的結果。
6-2. 常用的管道
$group
: 將集合中的文檔分組,可用於統計結果$match
:過濾數據,只輸出符合條件的⽂檔$project
:修改輸⼊⽂檔的結構$sort
:將輸⼊⽂檔排序後輸出$limit
:限制聚合管道返回的⽂檔書$skip
:跳過指定數量的⽂檔,並返回餘下的⽂檔
6-3. 表達式
語法: 表達式:'$列名'
常用表達式:
$sum
: 計算總和, $sum:1 表示以⼀倍計數$avg
: 計算平均值$min
: 獲取最⼩值$max
: 獲取最⼤值$push
: 在結果⽂檔中插⼊值到⼀個數組中$first
: 根據資源⽂檔的排序獲取第⼀個⽂檔數據$last
: 根據資源⽂檔的排序獲取最後⼀個⽂檔數據
6-4. $group
作用: 將集合中的⽂檔分組,常⽤於統計結果
_id
表示分組的依據,使⽤某個字段的格式爲 ‘$字段
’
代碼示例:
// 按照gendr分組
db.students.aggregate(
{$group:{_id:'$gender', count:{$sum:1}}}
)
// 按照gender分組,獲取不同組的平均年齡
db.students.aggregate(
{$group:{_id:'$gender',count:{$sum:1}, avg_age:{$avg:'$age'}}}
)
6-5. match
// match是管道命令,能將結果交給後一個管道,但是find不行
// 查詢年齡大於20的學生
db.students.aggregate(
{$match:{age:{$gt:20}}}
)
// 查詢年齡大於20的男生,女生人數
db.students.aggregate(
{$match:{age:{$gt:20}}},
{$group:{_id:'$gender',count:{$sum:1}}}
)