Day1.MongoDB學習筆記1 - 20181201
零、大資料引言
- 什麼是大資料,其本質是什麼?
①、資料的儲存:分散式檔案系統(分散式儲存)
②、資料的計算:分散式計算
有兩個大資料相關的技術Hadoop(基於java語言開發)和Spark(基於Scala語言,Scala基於java)
- 大資料的基礎和學習路線
1)Java基礎和Linux基礎
2)Hadoop的學習:體系結構、原理、程式設計
①第一階段:HDFS(儲存:分散式檔案系統)、MapReduce(java程式:資料的計算)、HBase(NoSql)
②第二階段:資料分析引擎 :Hive、Pig;資料採集引擎:Sqoop、Flume
③第三階段:一些元件:HUE(管理工具:基於網頁管理Hadoop)、ZooKeeper(實現Hadoop的HA)、Dozie(工作流引擎)
3)Spark的學習:
①第一階段:Scala程式語言
②第二階段:Spark Core(基於記憶體的資料計算)
③第三階段:Spark SQL(類似sql語句,用來操作大資料)
④第四階段:Spark Streaming(實時流式計算)
4)Apache Storm的學習(實時結果儲存):類似Spark Streaming 、Redis基於記憶體NoSql
一、資料儲存 【企業中如何進行資料的儲存?】
-
資料的分類(大致分三種)
①、結構化資料
資料有規則,可使用傳統資料庫表進行儲存
RDBS:oracle、mysql
(“主從複製叢集”,binlog,到達資料備份,高可用;
“讀寫分離叢集”,主寫從讀,達到高效能)
(“海量資料儲存”,大資料量,分庫分表,水平拆分(將一張大表資料水平分成小表))
(分表操作示例:主鍵%模小表的數量,均勻選擇小表儲存資料)
(MyCat:阿里的分庫分表中介軟體)②、半結構化資料
有一定規則,資料有變化,例:json,xml 選擇NoSQL儲存(不是結構化資料)
-
NoSQL優勢與缺點?儲存海量資料(日誌,物流)
優:1.高可擴充套件性(水平擴充套件),2.分散式計算,3.低成本,4.資料結構靈活無限制,5.沒有複雜關係
缺:1.弱事務,2.查詢語言不統一且功能有限,3.資料安全較差 -
選擇?
1.事務要求高 資料完整性特別重要,使用關係型資料庫
2.一般的資料或者後期可能擴充套件的資料,使用NoSql
3.不重到的資料(快取)redis、memcached
4.二進位制資料 fastdfs,公司內部特有分散式檔案系統 -
資料庫
redis 鍵值型資料庫
mongodb 文件型資料庫(最像關係型資料庫NoSql產品)
Hbase 列儲存NoSQL (即可存結構,又可半結構)
Neo4j 圖形儲存Nosq③、非結構化資料
指:二進位制資料,無法文字開啟的檔案
a、儲存伺服器不好,會影響伺服器效能,資料可能會丟失,如果tomcat構建叢集的化,可能會造成檔案無法訪問。
b、mysql資料庫: blob資料型別,大規模的檔案儲存 和 讀取影響效能
c、fastdfs分散式檔案系統:特性負載均衡,冗餘備份,檔案去重特性
(fastdfs叢集:同group(組)自動資料同步,
tracker伺服器:處理請求排程;
storage伺服器:儲伺服器)
二、MongoDB引言
- MongoDB是一款免費開源的NoSql文件型資料庫,旨在為Web應用提供可擴充套件的高效能資料儲存解決方案。
- MongoDB特點
1、資料儲存格式為BSON(一種二進位制形式的儲存格式,類似於JSON)形式field:value
{
name:"name",
age:22,
status:"B",
groups:["g1","g2"]
}
2、豐富的查詢語言(CRUD、資料聚合、全文檢索、地理位置查詢)——最像關係型資料庫
3、高可用(副本集)——類似“主從複製” + 容錯糾錯能力
4、水平擴充套件,支援海量資料儲存(分片)
5、MongoDB支援各種程式語言:RUBY,PYTHON,JAVA,C++,PHP,C#等多種語言
6、支援完全索引——所有欄位都可索引
三、MongoDB中概念解析
sql術語 | MongoDB術語 | 說明 |
---|---|---|
database | database | 資料庫 |
table | collection | 集合 |
row | ducument | 文件,一條記錄 |
index | index | 索引 |
primary key | primary key | 主鍵,MongoDB自動將_id欄位設定為主鍵 |
foreign key | 無 | 無 |
四、環境搭建 (最新只在64位執行)
- 從零開始大搭環境
①安裝號Linux64位後,執行操作啟用ip
ifconfig -a //檢視ip情況
vi /etc/sysconfig/network-scripts/ifcfg-eth0 //進入vi編輯,多使用tab補全避免出錯
//將onboot改成yes
儲存編輯後
ifup eth0 //啟動eth0
ifconfig -a //檢視ip生效否(我的inet addr是192.168.153.136)
②使用CRT遠端操作
//連線成功後 alt+p 進入準備上傳(打開了個新視窗)
//將檔案拖入黑視窗
//去到原始視窗 ll 檢視檔案
tar -zxvf mongodb-linux-x86_64-3.6.9.tgz //解壓
mv mongodb-linux-x86_64-3.6.9 mongodb //安裝 並 重新命名為mongodb
cd mongodb //進入mongodb資料夾,可以檢視下目錄結構,在bin下檢視命令
service iptables status; //檢視防火牆狀態
service iptables stop; //關閉防火牆
指令詳情:
./mongod -help //可檢視指令詳情
~clone session //開啟新視窗
mkdir -p /data/db //遞迴建立db資料夾
~在原視窗
./mongod --port 27017 --dbpath=/data/db //啟動服務,並指定啟動埠號和檔案儲存目錄
./mongod --port 27017 --dbpath=/data/db --bind_ip_all //繫結ip啟動
出現 waiting for connections on port 27017 表示啟動生效
~在克隆的新視窗
cd mongodb/bin //先進入資料夾,(ps:滑鼠選擇即是複製)
./mongo 127.0.0.1:27017 //遠端連線mongodb 地址+埠
- tips:
mongodb命令視窗支援javascript
mongodb類似mysql,選庫再選表
五、常用指令
啟服務與進入資料庫
cd mongodb/bin
./mongod --port 27017 --dbpath=/data/db --bind_ip_all
新視窗
cd mongodb/bin
./mongo 127.0.0.1:27017
資料庫相關,常用指令
cls //清屏
show dbs //展示所有資料庫資訊 ps:分號可加可不加
db //展示當前使用的資料庫
use 資料庫名 //切換資料庫
db.dropDatabase() //刪除資料庫
db.createCollection("first") //建立集合,名稱”first“,【類似建立table】
MongoDB的增刪改查操作
- 增加 insert
單個文件插入
db.COLLECTION_NAME.insert(document)
//插入 COLLECTION_NAME類似表名、 document bson格式資料
批量文件插入
db.COLLECTION_NAME.insert([document,document1.....]) //注意[]
注:在高版本mongodb中又新增了 db.collection.insertOne()和db.collection.insertMany() 這兩個方法,分別用來插入單個文件和多個文件(推薦使用,好區分)
ps:tab鍵可補全命令
- 簡單查詢 find
查集合中所有文件
db.collection.find({}) //等同於SQL查詢中的 SELECT * FROM collection
db.collection.find({}).pretty(); //優雅顯示
指定條件查詢 { <field1 >: <value1>}
db.collection.find({ field1 :value1 });
//類似於 select * from collection where field1 = value1
- 修改 update
db.collection.update(<filter>, <update>); //修改xxx 為 yyy
db.collection.updateOne(<filter>, {<update operator>: { <field1>: <value1>, ... }) //只修改符合條件的第一條文件
注:$set 操作符 使用指定的value替換舊值,如果修改屬性不存在則 建立
db.collection.updateMany(<filter>, {<update operator>: { <field1>: <value1>, ... }) //批量修改
db.collection.replaceOne() //替換除_id外的所有屬性
- 刪除 deleteOne / deleteMany
db.collection.deleteOne({<field1>: <value1>,...}) //單刪
db.collection.deleteMany({<field1>: <value1>,...}) //批刪
MongoDB的複雜查詢
- 使用查詢操作符指定條件
語法: { <field1 > : { <operator1 >: <value1 > }, ... }
其中,operator:
$in //列舉查詢,等同in
$and //等同and ps:,也等同and
$or
$lt //<
$gt //>
$lte //<=
$gte //>=
- 查詢結果排序
語法: db.collection.find().sort({_id:1}) //1 升序、-1 降序
- 分頁查詢
語法: db.collection.find().sort().skip(起始條數).limit(結束條數)
- 總條數
語法: db.collection.find().count()
- 模糊查詢
語法: db.collection.find({"name":/b/});
六、使用Java操作MongoDB
- 依賴
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
<version>3.6.1</version>
</dependency>
- 插入
@Test
public void testInsert(){
//建立連線
MongoClient mongoClient = new MongoClient("192.168.153.136", 27017);
//選擇庫
MongoDatabase database = mongoClient.getDatabase("test1");
//拿到集合物件
MongoCollection<Document> collection = database.getCollection("first");
//建立Document物件 BSON形式
Document document = new Document().append("name","duncan")
.append("num","21")
.append("friends", Arrays.asList("parker","manu","popo"));
collection.insertOne(document);
mongoClient.close();
}
可能出現的錯誤:
①connect time out //連線超時,關閉防火牆
②connection refused:connect
③Exception opening socket //3.6版本的MongoDB,只允許localhost連線,使用
// ./mongod --port 27017 --dbpath=/data/db --bind_ip_all //繫結ip啟動
- 修改 刪除 同理
- 查詢 亦同理
@Test
public void testFind(){
FindIterable<Document> documents = collection.find();
for (Document document : documents) {
System.out.println(document);
}
}
//其他
// 模糊查詢 引數二:模糊條件
documents = collection.find(regex("test","test"));
// 排序 SELECT * FROM t_user WHERE i >= 90 order by i desc
documents = collection.find(gt("i",90)).sort(Sorts.descending("i"));
// 分頁查詢
documents = collection.find().skip(50).limit(10);