1. 程式人生 > >Day1.MongoDB學習筆記1 - 20181201

Day1.MongoDB學習筆記1 - 20181201

零、大資料引言

  1. 什麼是大資料,其本質是什麼?
    ①、資料的儲存:分散式檔案系統(分散式儲存)
    ②、資料的計算:分散式計算

有兩個大資料相關的技術Hadoop(基於java語言開發)和Spark(基於Scala語言,Scala基於java)

  1. 大資料的基礎和學習路線
    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

一、資料儲存 【企業中如何進行資料的儲存?】

  1. 資料的分類(大致分三種)
    ①、結構化資料
    資料有規則,可使用傳統資料庫表進行儲存
    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位執行)

  1. 從零開始大搭環境
    ①安裝號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格式資料

圖1.05
批量文件插入

db.COLLECTION_NAME.insert([document,document1.....])	//注意[]

圖1.07
注:在高版本mongodb中又新增了 db.collection.insertOne()和db.collection.insertMany() 這兩個方法,分別用來插入單個文件和多個文件(推薦使用,好區分)
ps:tab鍵可補全命令

  • 簡單查詢 find
    查集合中所有文件
db.collection.find({}) //等同於SQL查詢中的 SELECT * FROM collection
db.collection.find({}).pretty();	//優雅顯示	

圖1.06
指定條件查詢 { <field1 >: <value1>}

db.collection.find({ field1 :value1 }); 
//類似於 select * from collection where field1 = value1

圖1.08

  • 修改 update
db.collection.update(<filter>, <update>);	//修改xxx 為 yyy
db.collection.updateOne(<filter>, {<update operator>: { <field1>: <value1>, ... }) //只修改符合條件的第一條文件

圖1.09
注:$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>,...})	//批刪

圖1.09

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

  1. 依賴
	<dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>mongodb-driver</artifactId>
        <version>3.6.1</version>
    </dependency>
  1. 插入
	@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啟動

圖1.12

  1. 修改 刪除 同理
  2. 查詢 亦同理
	@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);