大綱:
1、MongoDb的體系結構
2、MongoDb安裝配置與基礎命令
3、MongoDB CRUD與全文索引
一、MongoDb的體系結構
概要:
- NoSql的概念
- NoSql的應用場景
- MongoDb的邏輯組成
1、NoSql的概念
NoSQL(NoSQL = Not Only SQL ),意即“不僅僅是 [SQL](https://baike.baidu.com/item/SQL) ”,互聯網的早期我們的數據大多以關係型數據庫來存儲的。其特點是規範的數據結構(預定義模式)、強一至性、表與表之間通過外鍵進行關聯,這些特徵使我們對數據的管理更加清晰和嚴謹,但隨着互聯網的發展數據成爆炸式的增長我們對數據庫需要更好的靈活性和更快的速度。這就是NoSql可以做到的。它不需要預先定義模式,沒有主外鍵關聯、支持分片、支持複本。
NoSql的分類:
鍵值(Key-Value)存儲數據庫
這一類數據庫主要會使用到一個哈希表,這個表中有一個特定的鍵和一個指針指向特定的數據。Key/value模型對於IT系統來說的優勢在於簡單、易部署。但是如果DBA只對部分值進行查詢或更新的時候,Key/value就顯得效率低下了。舉例如:Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB.
** **列存儲數據庫。
這部分數據庫通常是用來應對分佈式存儲的海量數據。鍵仍然存在,但是它們的特點是指向了多個列。這些列是由列家族來安排的。如:Cassandra, HBase, Riak.
文檔型數據庫
文檔型數據庫的靈感是來自於Lotus Notes辦公軟件的,而且它同第一種鍵值存儲相類似。該類型的數據模型是版本化的文檔,半結構化的文檔以特定的格式存儲,比如JSON。文檔型數據庫可 以看作是鍵值數據庫的升級版,允許之間嵌套鍵值。而且文檔型數據庫比鍵值數據庫的查詢效率更高。如:CouchDB, MongoDb. 國內也有文檔型數據庫SequoiaDB,已經開源。
圖形(Graph)數據庫
圖形結構的數據庫同其他行列以及剛性結構的SQL數據庫不同,它是使用靈活的圖形模型,並且能夠擴展到多個服務器上。NoSQL數據庫沒有標準的查詢語言(SQL),因此進行數據庫查詢需要制定數據模型。許多NoSQL數據庫都有REST式的數據接口或者查詢API。如:Neo4J, InfoGrid, Infinite Graph.
2、NoSql的應用場景
NoSQL數據庫在以下的這幾種情況下比較適用:
1、數據模型比較簡單;
2、需要靈活性更強的IT系統;
3、對數據庫性能要求較高;
4、不需要高度的數據一致性;
- 基於豆瓣電影舉例說明NoSQL的應用場景
- 電影基本信息分析
- 電影與明星關係存儲
3、MongoDb的邏輯組成
體系結構:
邏輯結構與關係數據庫的對比:
關係型數據庫 | MongoDb |
---|---|
database(數據庫) | database(數據庫) |
table (表) | collection( 集合) |
row( 行) | document( BSON 文檔) |
column (列) | field (字段) |
index(唯一索引、主鍵索引) | index (全文索引) |
join (主外鍵關聯) | embedded Document (嵌套文檔) |
primary key(指定1至N個列做主鍵) | primary key (指定_id field做爲主鍵) |
aggreation(groupy) | aggreation (pipeline mapReduce) |
二、MongoDb安裝配置與基礎命令
概要:
-
mongoDb版本說明
-
mongoDb啓動參數說明
-
客戶端Shell 的使用及參數說明
-
數據庫與集合的基礎操作
-
mongoDb社區版說明
下載地址:https://www.mongodb.com/download-center/community
#下載
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.5.tgz
# 解壓
tar -zxvf mongodb-linux-x86_64-4.0.5.tgz
2.mongoDb啓動參數說明
mongoDb 由C++編寫,下載下來的包可以直接啓動
#創建數據庫目錄
mkdir -p /data/mongo
# 啓動mongo
./bin/mongod --dbpath=/data/mongo/
常規參數
參數 | 說明 |
---|---|
dbpath | 數據庫目錄,默認/data/db |
bind_ip | 監聽IP地址,默認全部可以訪問 |
port | 監聽的端口,默認27017 |
logpath | 日誌路徑 |
logappend | 是否追加日誌 |
auth | 是開啓用戶密碼登陸 |
fork | 是否已後臺啓動的方式登陸 |
config | 指定配置文件 |
配置文件示例
vim mongo.conf
內容:
dbpath=/data/mongo/
port=27017
bind_ip=0.0.0.0
fork=true
logpath = /data/mongo/mongodb.log
logappend = true
auth=false
已配置文件方式啓動
./bin/mongod -f mongo.conf
3.客戶端Shell 的使用及參數說明
#啓動客戶端 連接 本機的地的默認端口
./bin/mongo
# 指定IP和端口
./bin/mongo --host=127.0.0.1 --port=27017
mongo shell 是一個js 控臺,可以執行js 相關運算如:
> 1+1
2
> var i=123;
> print(i)
123
>
4.數據庫與集合的基礎操作
#查看數據庫
show dbs;
#切換數據庫
use luban;
#創建數據庫與集合,在插入數據時會自動 創建數據庫與集和
db.friend.insertOne({name:"wukong",sex:"man"});
#查看集合
show tables;
show collections;
#刪除集合
db.friend.drop();
#刪除數據庫
db.dropDatabase();
三、MongoDB CRUD與全文索引
概要:
-
數據的新增的方式
-
數據的查詢
-
數據的修改刪除
-
全文索引查詢
-
數據的新增的方式
關於Mongodb數據插入的說明
- 數據庫的新增不需要序先設計模型結構,插入數據時會自動創建。
- 同一個集合中不同數據字段結構可以不一樣
插入相關方法:
//插入單條
db.friend.insertOne({name:"wukong",sex:"man"});
// 插入多條
db.friend.insertMany([
{name:"wukong",sex:"man"},{name:"diaocan",sex:"woman",age:18,birthday:new Date("1995-11-02")},{name:"zixiao",sex:"woman"}
]);
// 指定ID
db.friend.insert([
{_id:1,name:"wokong",sex:"man",age:1},
{_id:2,name:"diaocan",sex:"women",birthday:new Date("1988-11- 11")}
])
2、數據的查詢
概要:
- 基於條件的基礎查詢
- and、and、or、in、in、gt、gte、gte、lt、$lte 運算符
- 基於 sort skip limit 方法實現排序與分頁
- 嵌套查詢
- 數組查詢
- 數組嵌套查詢
基礎查詢:
#基於ID查找
db.emp.find({_id:1101})
#基於屬性查找
db.emp.find({"name":"魯班"})
# && 運算 與大於 運算
db.emp.find({"job":"講師","salary":{$gt:8000}})
# in 運算
db.emp.find({"job":{$in:["講師","客服部"]}})
# or 運算
db.emp.find({$or:[{job:"講師" },{job:"客服部"}] })
排序與分頁:
// sort skip limit
db.emp.find().sort({dep:1,salary:-1}).skip(5).limit(2)
嵌套查詢:
# 錯誤示例:無結果
db.student.find({grade:{redis:87,dubbo:90 });
#錯誤示例:無結果
db.student.find({grade:{redis:87,dubbo:90,zookeper:85} })
# 基於複合屬性查找 時必須包含其所有的值 並且順序一至
db.student.find({grade:{redis:87,zookeper:85,dubbo:90} })
#基於複合屬性當中的指定值 查找。注:名稱必須用雙引號
db.student.find({"grade.redis":87});
db.student.find({"grade.redis":{"$gt":80}});
數組查詢:
db.subject.insertMany([
{_id:"001",name:"陳霸天",subjects:["redis","zookeper","dubbo"]},
{_id:"002",name:"張明明",subjects:["redis","Java","mySql"]},
{_id:"003",name:"肖炎炎",subjects:["mySql","zookeper","bootstrap"]},
{_id:"004",name:"李鬼才",subjects:["Java","dubbo","Java"]},
])
#無結果
db.subject.find({subjects:["redis","zookeper"]})
#無結果
db.subject.find({subjects:["zookeper","redis","dubbo"]})
# 與嵌套查詢一樣,必須是所有的值 並且順序一至
db.subject.find({subjects:["redis","zookeper","dubbo"]})
# $all 匹配數組中包含該兩項的值。注:順序不作要求
db.subject.find({subjects:{"$all": ["redis","zookeper"]}})
注:
# 簡化數組查詢
db.subject.find({subjects:"redis"})
# 簡化數組查詢 ,匹配數組中存在任意一值。與$all相對應
db.subject.find({subjects:{$in: ["redis","zookeper"]}})
數組嵌套查詢:
#基礎查詢 ,必須查詢全部,且順序一至
db.subject2.find({subjects:{name:"redis",hour:12} })
#指定查詢第一個數組 課時大於12
db.subject2.find({"subjects.0.hour":{$gt:12}})
#查詢任科目 課時大於12
db.subject2.find({"subjects.hour":{$gt:12}})
# $elemMatch 元素匹配,指定屬性滿足,且不要求順序一至
db.subject2.find({subjects:{$elemMatch:{name:"redis",hour:12}}})
# 數組中任意元素匹配 不限定在同一個對象當中
db.subject2.find({"subjects.name":"mysql","subjects.hour":120})
修改
#設置值
db.emp.update({_id:1101} ,{ $set:{salary:10300} })
#自增
db.emp.update({_id:1101} ,{ $inc:{salary:200}})
#基於條件 更新多條數據
# 只會更新第一條
db.emp.update({"dep":"客服部"},{$inc:{salary:100}})
# 更新所有 匹配的條件
db.emp.updateMany({"dep":"客服部"},{$inc:{salary:100}})
3、數據的修改與刪除
修改
#設置值
db.emp.update({_id:1101} ,{ $set:{salary:10300} })
#自增
db.emp.update({_id:1101} ,{ $inc:{salary:200}})
#基於條件 更新多條數據
# 只會更新第一條
db.emp.update({"dep":"客服部"},{$inc:{salary:100}})
# 更新所有 匹配的條件
db.emp.updateMany({"dep":"客服部"},{$inc:{salary:100}})
刪除:
// 基於查找刪除
db.emp.deleteOne({_id:1101})
// 刪除整個集合
db.project.drop()
// 刪除庫
db.dropDatabase()
4、全文索引
索引的創建
db.project.createIndex({name:"text",description:"text"})
基於索引分詞進行查詢
db.project.find({$text:{$search:"java jquery"}})
基於索引 短語
db.project.find({$text:{$search:"\"Apache ZooKeeper\""}})
過濾指定單詞
db.project.find({$text:{$search:"java apache -阿里"}})
查看執行計劃
db.project.find({$text:{$search:"java -阿里"}}).explain("executionStats")
附:數據庫腳本
// 職工信息
db.emp.insert(
[
{_id:1101,name:'魯班' ,job:'講師' ,dep:'講師部',salary:10000},
{_id:1102,name:'悟空' ,job:'講師' ,dep:'講師部',salary:10000},
{_id:1103,name:'諸葛' ,job:'講師' ,dep:'講師部',salary:10000},
{_id:1105,name:'趙雲' ,job:'講師' ,dep:'講師部',salary:8000},
{_id:1106,name:'韓信',job:'校長' ,dep:'校辦',salary:20000},
{_id:1107,name:'貂蟬' ,job:'班主任' ,dep:'客服部',salary:8000},
{_id:1108,name:'安其' ,job:'班主任' ,dep:'客服部',salary:8000},
{_id:1109,name:'李白' ,job:'教務' ,dep:'教務處',salary:8000},
{_id:1110,name:'默子' ,job:'教務',dep:'教務處',salary:8000},
{_id:1111,name:'大喬',job:'助教' ,dep:'客服部',salary:5000},
{_id:1112,name:'小喬' ,job:'助教' ,dep:'客服部',salary:3000},
]
);
// 學生信息
db.student.insertMany([
{_id:"001",name:"陳霸天",age:5,grade:{redis:87,zookeper:85,dubbo:90}},
{_id:"002",name:"張明明",age:3,grade:{redis:86,zookeper:82,dubbo:59}},
{_id:"003",name:"肖炎炎",age:2,grade:{redis:81,zookeper:94,dubbo:88}},
{_id:"004",name:"李鬼才",age:6,grade:{redis:48,zookeper:87,dubbo:48}}
])
// 學生科目
db.subject.insertMany([
{_id:"001",name:"陳霸天",subjects:["redis","zookeper","dubbo"]},
{_id:"002",name:"張明明",subjects:["redis","Java","mySql"]},
{_id:"003",name:"肖炎炎",subjects:["mySql","zookeper","bootstrap"]},
{_id:"004",name:"李鬼才",subjects:["Java","dubbo","Java"]},
])
db.subject2.insertMany([
{_id:"001",name:"陳霸天",subjects:[
{name:"redis",hour:12},
{name:"dubbo",hour:120},
{name:"zookeper",hour:56}]
},
{_id:"002",name:"張明明",subjects:[{name:"java",hour:120},{name:"mysql",hour:10},{name:"oracle",hour:30}]},
{_id:"003",name:"肖炎炎",subjects:[{name:"mysql",hour:12},{name:"html5",hour:120},{name:"netty",hour:56}]},
{_id:"004",name:"李鬼才",subjects:[{name:"redis",hour:12},{name:"dubbo",hour:120},{name:"netty",hour:56}]}
])
// 課程項目
db.project.insert(
[ { _id: 1, name: "Java Script", description: "name is js and jquery" },
{ _id: 2, name: "Git", description: "Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency" },
{ _id: 3, name: "Apache dubbo", description: "Apache Dubbo is a high-performance, java based open source RPC framework.阿里 開源 項目" },
{ _id: 4, name: "Redis", description: "Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker. It supports data structures" },
{ _id: 5, name: "Apache ZooKeeper", description: "Apache ZooKeeper is an effort to develop and maintain an open-source server which enables highly reliable distributed coordination" }
]
)