版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
文檔存儲數(shù)據(jù)庫—MongoDB隨著企業(yè)經(jīng)營水平的提高,各網(wǎng)站的訪問量在逐步增加,隨之而來的數(shù)據(jù)信息量也在大幅增長。帶來的問題是用戶在面對大量信息時無法快速獲取需要的信息,使得信息的使用效率降低。用戶在瀏覽搜尋想要的信息過程中,需要花費大量的時間,這種情況的出現(xiàn)造成了用戶的不斷流失,對企業(yè)造成巨大的損失。智能推薦服務(wù)可以為用戶提供個性化的服務(wù),改善用戶瀏覽體驗,增加用戶黏度,從而使用戶與企業(yè)之間建立穩(wěn)定交互關(guān)系,實現(xiàn)客戶鏈式反應(yīng)增值。而在進行智能推薦服務(wù)前,需要先為網(wǎng)站的海量數(shù)據(jù)提供一個存儲與查詢的解決方案。項目描述項目背景某電子商務(wù)類網(wǎng)站,致力于為用戶提供豐富的法律信息與咨詢服務(wù),當用戶訪問網(wǎng)站頁面時,系統(tǒng)會記錄用戶訪問網(wǎng)站的日志。因此,該網(wǎng)站已保存了數(shù)據(jù)量非常龐大的用戶瀏覽網(wǎng)站日志數(shù)據(jù),用戶訪問數(shù)據(jù)的字段名稱及其說明如下表所示。項目描述名稱說明名稱說明id訪問記錄的編號IDfullURL網(wǎng)址realIP真實IPfullURLId網(wǎng)址類型realAreacode地區(qū)編號hostname源地址名userAgent瀏覽器代理pageTitle網(wǎng)頁標題userOS用戶瀏覽器類型pageTitleCategoryId標題類型IDuserID用戶IDpageTitleCategoryName標題類型名稱clientID客戶端IDpageTitleKw標題類型關(guān)鍵字timestamp時間戳fullReferrer入口源timestamp_format標準化時間fullReferrerURL入口網(wǎng)址pagePath路徑organicKeyword搜索關(guān)鍵字ymd年月日source搜索源本項目將根據(jù)網(wǎng)站用戶日志數(shù)據(jù)的存儲需求實現(xiàn)MongoDB數(shù)據(jù)庫的安裝與配置,并使用MongoDB數(shù)據(jù)庫實現(xiàn)用戶瀏覽網(wǎng)站日志數(shù)據(jù)的存儲、查詢、刪除等過程。項目描述項目目標了解MongoDB及其數(shù)據(jù)模型,學(xué)習(xí)MongoDB的搭建過程,并根據(jù)網(wǎng)站對用戶日志數(shù)據(jù)的存儲需求安裝配置MongoDB數(shù)據(jù)庫。學(xué)習(xí)MongoDB中數(shù)據(jù)庫的創(chuàng)建與管理操作,并創(chuàng)建一個用于存儲用戶網(wǎng)站日志數(shù)據(jù)的數(shù)據(jù)庫。學(xué)習(xí)MongoDB中文檔數(shù)據(jù)的插入、刪除、更新、查詢命令,將用戶網(wǎng)站日志數(shù)據(jù)作為文檔數(shù)據(jù)存儲至數(shù)據(jù)庫中,并對文檔數(shù)據(jù)進行簡單查詢。學(xué)習(xí)MongoDBJavaAPI基本操作,創(chuàng)建用于存儲網(wǎng)站用戶日志數(shù)據(jù)的數(shù)據(jù)庫,并將全部網(wǎng)站用戶日志數(shù)據(jù)作為文檔數(shù)據(jù)導(dǎo)入至數(shù)據(jù)庫中。通過MongoDBJavaAPI從網(wǎng)站和用戶兩個維度實現(xiàn)用戶日志數(shù)據(jù)查詢與分析,包括查詢網(wǎng)站每月及每日的訪問流量分布、查詢每個用戶的訪問記錄數(shù)。項目描述項目分析1安裝分布式MongoDB目錄認識MongoDB2創(chuàng)建存儲用戶日志數(shù)據(jù)的數(shù)據(jù)庫3MongoDB是一個基于分布式文件存儲的數(shù)據(jù)庫,由C++語言編寫,旨在為WEB應(yīng)用提供可擴展的高性能數(shù)據(jù)存儲解決方案。本小節(jié)的任務(wù)是了解MongoDB。任務(wù)描述大數(shù)據(jù)時代,數(shù)據(jù)的實時更新迭代迅速,如網(wǎng)站上用戶的個人信息、用戶生成的數(shù)據(jù)和操作日志等都已經(jīng)呈現(xiàn)幾何倍數(shù)增加,原有的關(guān)系數(shù)據(jù)庫管理系統(tǒng)(RDBMS)已經(jīng)無法滿足這類數(shù)據(jù)的存儲和查詢,取而代之的是非關(guān)系型數(shù)據(jù)庫(NoSQL),如HBase、MongoDB等。了解MongoDBHBase和MongoDB皆為非關(guān)系型數(shù)據(jù)庫(NoSQL),但是由于NoSQL的非結(jié)構(gòu)化的特點,所以HBase和MongoDB之間的差異性相對較大。HBase主要由命名空間、表、行鍵、列簇、列等幾個部分組成,通過行鍵、列簇及列定位數(shù)據(jù)位置,而MongoDB以鍵值對的形式存儲數(shù)據(jù),結(jié)構(gòu)簡單,表中的數(shù)據(jù)以鍵進行查詢。此外,HBase作為Hadoop生態(tài)圈的一部分,其底層必須依靠Hadoop。由于MongoDB是一個相對獨立的組件,無須依靠其他組件,所以搭建相對簡單。MongoDB是一個文檔數(shù)據(jù)庫,具有很強的可伸縮性和靈活性。MongoDB可以在文檔中直接插入數(shù)組之類的復(fù)雜數(shù)據(jù)類型,并且文檔的key和value不是固定的數(shù)據(jù)類型和大小。開發(fā)者在使用MongoDB時無須預(yù)定義關(guān)系型數(shù)據(jù)庫中的表(table)等數(shù)據(jù)庫對象,設(shè)計數(shù)據(jù)庫將變得非常方便,可以大大地提升開發(fā)進度。了解MongoDB1.簡介MongoDB為基于Documentdatamodel(文檔數(shù)據(jù)模型)的非關(guān)系型數(shù)據(jù)庫。MongoDB以BSON格式存儲數(shù)據(jù),類似于JSON數(shù)據(jù)形式。關(guān)系型數(shù)據(jù)庫使用表(table)形式存儲數(shù)據(jù),而MongoDB則使用集合(collections)的形式。MongoDB支持臨時查詢。系統(tǒng)不用提前定義可以接收的查詢類型。MongoDB支持索引和次級索引。次級索引是指文檔有一個主鍵作為索引,同時允許文檔還擁有一個索引,提升查詢的效率。MongoDB是一個無結(jié)構(gòu)的數(shù)據(jù)庫。了解MongoDB2.特點網(wǎng)站數(shù)據(jù):MongoDB非常適合實時的插入、更新與查詢,可以滿足網(wǎng)站實時數(shù)據(jù)存儲的備份需求,并具備網(wǎng)站實時數(shù)據(jù)存儲所需的高度伸縮性。緩存:由于MongoDB的性能很高,所以適合作為信息基礎(chǔ)設(shè)施的緩存層。在系統(tǒng)重啟后,由MongoDB搭建的持久化緩存層可以避免下層的數(shù)據(jù)源過載。大尺寸、低價值的數(shù)據(jù):當存儲大量數(shù)據(jù)時,特別是TB級別以上數(shù)據(jù),傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(RDBMS)會出現(xiàn)進程中斷等問題,而MongoDB則可以存儲海量數(shù)據(jù)集。高伸縮性的場景:MongoDB非常適合由數(shù)十或數(shù)百臺服務(wù)器組成的數(shù)據(jù)庫,在MongoDB的路線圖中已經(jīng)包含對MapReduce引擎的內(nèi)置支持。用于對象及JSON數(shù)據(jù)的存儲:MongoDB的BSON數(shù)據(jù)格式非常適合文檔格式數(shù)據(jù)的存儲及查詢。了解MongoDB3.使用場景(1)文檔(document)文檔是MongoDB中數(shù)據(jù)的基本單位,類似于SQL等關(guān)系數(shù)據(jù)庫中的行(row),但是比行復(fù)雜。鍵及其關(guān)聯(lián)的值有序地放在一起就構(gòu)成了文檔。在代碼①“{“name”:“xiaoming”}”中,文檔只有一個鍵“name”,對應(yīng)的值為字符串類型的“xiaoming”。在多數(shù)情況下,文檔會包含多個鍵/值對,相當于關(guān)系數(shù)據(jù)庫中的多個字段。文檔的值不僅可以是字符串類型,而且可以是其他的數(shù)據(jù)類型,如整型、布爾型等,也可以是另外一個文檔,即文檔可以嵌套文檔。文檔的鍵只能是字符串類型,如代碼②“{“id”:“202001”,“age”:3}”。文檔中的鍵-值對是有序的。了解MongoDB數(shù)據(jù)模型1.MongoDB術(shù)語集合就是一組文檔,類似于關(guān)系數(shù)據(jù)庫中的表(table)。集合是無模式的,集合中的文檔可以是各式各樣的。例如,代碼①和代碼②中的文檔的鍵不同,值的類型也不同,但是可以將其存放在同一個集合中,即不同模式的文檔可以放在同一個集合中。盡管集合中可以存放任何類型的文檔,但在實際使用中很少會將所有文檔都放在同一個集合中。例如,對于網(wǎng)站的日志記錄,可以根據(jù)日志的級別進行存儲,Info級別日志存放在Info集合中,Debug級別日志存放在Debug集合中。這樣做的目的是方便對數(shù)據(jù)庫進行管理,提升查詢等基礎(chǔ)操作的效率。需要注意的是,創(chuàng)建多個集合對文檔進行存儲并不是MongoDB的強制要求,用戶可以靈活選擇存儲的方式。了解MongoDB數(shù)據(jù)模型(2)集合(collections)MongoDB中的數(shù)據(jù)庫與關(guān)系數(shù)據(jù)庫中的數(shù)據(jù)庫概念相似。在MongoDB中,文檔組成集合,集合組成數(shù)據(jù)庫。一個MongoDB實例中可以包含多個數(shù)據(jù)庫,數(shù)據(jù)庫之間可以看作相互獨立,且每個數(shù)據(jù)庫都有獨立的權(quán)限控制。在磁盤上,不同的數(shù)據(jù)庫存放在不同的文件中。在MongoDB中,主要存在以下系統(tǒng)數(shù)據(jù)庫。admin數(shù)據(jù)庫:一個權(quán)限數(shù)據(jù)庫,如果創(chuàng)建用戶的時候?qū)⒃撚脩籼砑拥絘dmin數(shù)據(jù)庫中,那么該用戶將自動繼承所有數(shù)據(jù)庫的權(quán)限。local數(shù)據(jù)庫:local數(shù)據(jù)庫永遠不會被復(fù)制,可以用于存儲本地單臺服務(wù)器的任意集合。config數(shù)據(jù)庫:當MongoDB使用分片模式時,config數(shù)據(jù)庫在內(nèi)部使用,用于保存分片的信息。了解MongoDB數(shù)據(jù)模型(3)數(shù)據(jù)庫(database)MongoDB常用數(shù)據(jù)類型如下表。了解MongoDB數(shù)據(jù)模型2.數(shù)據(jù)類型類型備注Integer整型數(shù)值,用于存儲數(shù)值,可分為32位或64位Double雙精度浮點值,用于存儲浮點值String字符串,存儲數(shù)據(jù)常用的數(shù)據(jù)類型。在MongoDB中,UTF-8編碼的字符串才是合法的Object一般用于內(nèi)嵌文檔Array一般用于數(shù)組或列表Binarydata二進制數(shù)據(jù),一般用于存儲二進制數(shù)據(jù)Objectid對象ID,用于創(chuàng)建文檔的IDBoolean布爾值,用于存儲布爾值(true/false)Date日期數(shù)據(jù)Null一般用于創(chuàng)建空值Timestamp時間戳1安裝分布式MongoDB目錄認識MongoDB2創(chuàng)建存儲用戶日志數(shù)據(jù)的數(shù)據(jù)庫3對MongoDB有了初步的了解后,開始安裝配置分布式MongoDB,分布式是指通過網(wǎng)絡(luò)等方式連接多個組件,通過交換信息協(xié)作而形成的系統(tǒng)。本小節(jié)的任務(wù)將以Linux系統(tǒng)為例,介紹分布式MongoDB的安裝過程,其中分布式MongoDB共有4個節(jié)點,包括1個主節(jié)點,3個子節(jié)點。任務(wù)描述在MongoDB官網(wǎng)中下載mongodb-linux-x86_64-3.0.6.tgz安裝包。當下載完成后,上傳至Linux虛擬機,輸入命令“tar-zxvfmongodb-linux-x86_64-3.0.6.tgz”解壓安裝包文件,解壓完成后輸入命令“mvmongodb-linux-x86_64-3.0.6/usr/local/mongodb”,將MongoDB安裝目錄移至/use/local/目錄下,并將文件名修改為mongodb。安裝配置MongoDB1.安裝包下載與解壓輸入命令“vi/etc/profile”打開profile文件,將MongoDB添加至環(huán)境變量中。保存并退出profile文件后,輸入命令“source/etc/profile”使更改生效。安裝配置MongoDB2.添加MongoDB至環(huán)境變量在MongoDB安裝目錄下,創(chuàng)建config配置文件所需文件目錄,如數(shù)據(jù)存放文件目錄master、slave1、slave2、slave3、配置文件目錄bin/conf和日志文件目錄log。切換至/usr/local/mongodb/bin/conf目錄,在該目錄下創(chuàng)建文件master.conf、slave1.conf、slave2.conf、slave3.conf。創(chuàng)建完成后修改上述配置文件。安裝配置MongoDB3.config配置文件將config的配置文件修改完成后,其余步驟如下。分發(fā)安裝目錄至各個子節(jié)點。使用自定義config文件啟動MongoDB。進入master節(jié)點下MongoDB安裝目錄,在bin目錄下輸入“./mongod-config/usr/local/mongodb/bin/conf/master.conf”命令,啟動MongoDB。在瀏覽器中輸入master節(jié)點的IP地址加端口號27017,如30:27017/。如果服務(wù)啟動成功,那么將會看到如下圖所示的信息。安裝配置MongoDBMongoDB默認會開啟一個HTTP協(xié)議的端口提供REST的服務(wù)(“mongod-dbpath=/usr/local/mongodb/master-rest”命令啟動),這個端口的端口號為服務(wù)器的端口號加上1000,MongoDB默認端口號為27017。在瀏覽器中輸入服務(wù)器的IP地址加上端口號28017(如30:28017),即可訪問MongoDBHTTP接口。訪問成功的頁面如下圖所示。訪問MongoDB
HTTP接口1安裝分布式MongoDB目錄認識MongoDB2創(chuàng)建存儲用戶日志數(shù)據(jù)的數(shù)據(jù)庫3在安裝完成MongoDB后,將在MongoDB中創(chuàng)建存儲用戶日志數(shù)據(jù)的數(shù)據(jù)庫。本小節(jié)的任務(wù)如下。介紹如何使用MongoDBshell連接MongoDB服務(wù)器。MongoDB數(shù)據(jù)庫的創(chuàng)建、刪除操作。任務(wù)描述在Linux系統(tǒng)中,使用MongoDBshell連接MongoDB服務(wù)器的步驟如下。輸入命令“cd$MONGODB_HOME/bin”進入MongoDB安裝目錄下的bin目錄。在4個節(jié)點的bin目錄下輸入命令“./mongod-fconf/master.conf”,“./mongod-fconf/slave1.conf”,“./mongod-fconf/slave2.conf”和“./mongod-fconf/slave3.conf”,并在master節(jié)點輸入命令“./mongod-dbpath=/usr/local/mongodb/master–rest”開啟MongoDB服務(wù)。打開一個新的master命令窗口,進入到MongoDB安裝目錄下的bin目錄中,輸入命令“./mongod”,使用默認端口連接MongoDB服務(wù)器,進入MongoDBShell界面。創(chuàng)建與刪除數(shù)據(jù)庫1.MongoDBshell連接服務(wù)器當連接完成后,可以執(zhí)行一些簡單的加減操作,進行啟動測試,如下圖。創(chuàng)建與刪除數(shù)據(jù)庫返回輸入“./mongod”的命令窗口即可看到該窗口已新增一行信息:“connectionacceptedfrom:50956#1(1connectionnowopen)”,如下圖所示。該信息表明MongoDB服務(wù)器接收到了一個來自本機的連接。創(chuàng)建與刪除數(shù)據(jù)庫創(chuàng)建、刪除MongoDB數(shù)據(jù)庫的語法如下。//如果數(shù)據(jù)庫不存在,那么創(chuàng)建數(shù)據(jù)庫,否則切換到指定數(shù)據(jù)庫usedatabase_name//刪除當前所在的數(shù)據(jù)庫db.dropDatabase()當數(shù)據(jù)庫創(chuàng)建完成后,輸入命令“showdbs”,可以查看數(shù)據(jù)庫列表。需要注意的是,當一個新的數(shù)據(jù)庫創(chuàng)建完成,但尚未插入數(shù)據(jù)時,該數(shù)據(jù)庫將不顯示在數(shù)據(jù)庫列表中。MongoDB數(shù)據(jù)庫中不能直接插入數(shù)據(jù),只能在集合中插入數(shù)據(jù)。MongoDB不需要特意創(chuàng)建集合,只需要在語法中說明,集合將會自動創(chuàng)建。創(chuàng)建與刪除數(shù)據(jù)庫2.創(chuàng)建與刪除數(shù)據(jù)庫插入文檔數(shù)據(jù)的語法如下。db.collection_name.insert(document)當不使用“use”關(guān)鍵字指定數(shù)據(jù)庫時,所有操作都會在MongoDB默認數(shù)據(jù)庫test中執(zhí)行。創(chuàng)建與刪除數(shù)據(jù)庫MongoDB數(shù)據(jù)庫創(chuàng)建、刪除的完整示例如下圖。在示例中,創(chuàng)建了一個數(shù)據(jù)庫student,并向該數(shù)據(jù)庫中的student_info集合插入了一條文檔數(shù)據(jù)“{"id":202001,"name":"xiaoming"}”。插入數(shù)據(jù)完成后,查看數(shù)據(jù)庫列表,確認數(shù)據(jù)庫是否創(chuàng)建完成。確認數(shù)據(jù)庫已創(chuàng)建后,將其刪除,再次查看數(shù)據(jù)庫列表,檢驗刪除是否成功。創(chuàng)建與刪除數(shù)據(jù)庫使用MongoDBshell在MongoDB創(chuàng)建存儲用戶日志數(shù)據(jù)的數(shù)據(jù)庫user_info,并切換到該數(shù)據(jù)庫,向數(shù)據(jù)庫插入文檔數(shù)據(jù)“{”test“:1}”,使其創(chuàng)建成功。創(chuàng)建存儲用戶日志數(shù)據(jù)的數(shù)據(jù)庫的結(jié)果如下圖。任務(wù)實現(xiàn)6目錄使用MongoDB
Java
API創(chuàng)建電子商務(wù)日志數(shù)據(jù)存儲系統(tǒng)查詢MongoDB中用戶訪問HTML頁5存儲用戶日志數(shù)據(jù)到MongoDB4MongoDB創(chuàng)建數(shù)據(jù)庫完成后,即可將文檔數(shù)據(jù)插入數(shù)據(jù)庫中,在4.3小節(jié)中簡單的展示如何將數(shù)據(jù)插入文檔中。本小節(jié)的任務(wù)將通過實現(xiàn)存儲用戶日志數(shù)據(jù)到MongoDB來詳細介紹MongoDB的文檔插入、更新、刪除等操作。任務(wù)描述MongoDB可以使用insert()方法插入文檔數(shù)據(jù),插入文檔數(shù)據(jù)的語法已在上一小節(jié)介紹,參數(shù)解釋說明如下。db:表示當前所在的數(shù)據(jù)庫,默認為“test”。collection:表示文檔數(shù)據(jù)所要插入的集合(如demo_info),若該集合不存在,則新建集合。insert():表示插入文檔數(shù)據(jù)的方法。document:表示要插入的文檔數(shù)據(jù),由單個或多個鍵值對組成,如“{"title":"one","id":0}”。插入文檔數(shù)據(jù)insert()方法既可以逐條插入文檔數(shù)據(jù),又可以利用循環(huán)批量插入文檔數(shù)據(jù)。在數(shù)據(jù)庫demo分別使用逐條插入和循環(huán)批量插入的方式插入10條文檔數(shù)據(jù)至集合demo_info中。輸入“db.demo_info.find()”命令查看deno_info集合,結(jié)果如下圖。插入文檔數(shù)據(jù)MongoDB使用remove()方法刪除文檔數(shù)據(jù),MongoDB刪除文檔數(shù)據(jù)的語法如下,參數(shù)說明如右表。db.collection.remove(<query>,{justOne:<boolean>,writeConcern:<document>})刪除文檔數(shù)據(jù)參數(shù)說明query必選,表示刪除文檔的條件,相當于SQL數(shù)據(jù)庫中的WHERE關(guān)鍵字justOne可選,如果設(shè)置為false,那么刪除所有匹配條件的文檔;如果設(shè)為true或1,那么只刪除第一個匹配到的文檔。默認為falsewriteConcern可選,表示拋出異常的級別MongoDB刪除文檔數(shù)據(jù)示例如右圖所示。在集合demo_info中,刪除條件query為刪除鍵title,刪除鍵的值為many。當參數(shù)justOne設(shè)置為true時,remove()方法僅刪除了一條“id”為1的文檔數(shù)據(jù)。而當不設(shè)置參數(shù)justOne,使用默認值時,remove()方法會將滿足條件的8條文檔數(shù)據(jù)全部刪除。此外,如果將刪除條件設(shè)置為“{}”,那么此時的刪除條件為無限制條件,將會刪除集合中的所有數(shù)據(jù)。刪除文檔數(shù)據(jù)MongoDB使用update()方法更新集合中的文檔數(shù)據(jù)。MongoDB更新文檔數(shù)據(jù)的語法如下。db.collection.update(<query>,<update>,{upsert:<boolean>,multi:<boolean>,writeConcern:<document>})更新文檔數(shù)據(jù)MongoDB更新文檔數(shù)據(jù)的語法參數(shù)說明如下。query:必選,表示update的查詢條件,類似SQL中update使用時的where關(guān)鍵字。update:必選,表示對滿足條件的update對象進行更新的內(nèi)容,類似SQL中update使用時的set關(guān)鍵字。upsert:可選,如果設(shè)置為false,那么當update條件不滿足時,則不會對集合進行任何修改;如果設(shè)置為true,那么當需更新的文檔數(shù)據(jù)中,不存在滿足update條件的文檔對象時,會將此次更新結(jié)果作為新的文檔數(shù)據(jù)插入到集合中。默認為false。multi:可選,如果設(shè)置為false,那么只更新匹配到的第一條滿足條件的文檔數(shù)據(jù);如果設(shè)置為true,那么更新滿足條件的所有文檔數(shù)據(jù)。默認為false。writeConcern:可選,表示拋出異常的級別。更新文檔數(shù)據(jù)利用循環(huán)重新向demo_info集合插入9條文檔數(shù)據(jù),并使用update()方法將所有滿足“id”大于或等于5的文檔數(shù)據(jù)的“title”更新為“newdata”。執(zhí)行結(jié)果如下圖,在所有鍵中,“id”值大于或等于5的文檔數(shù)據(jù)的“title”值都從原來的“olddata”更新為了“newdata”。更新文檔數(shù)據(jù)由于用戶日志中存在數(shù)十萬條記錄,要將所有的文檔數(shù)據(jù)手動插入MongoDB將會耗費大量的時間,并且在用戶數(shù)據(jù)的22個字段中存在著大量無規(guī)律字段,所以無法通過簡單的循環(huán)插入數(shù)據(jù)。因此本小節(jié)將存儲部分用戶日志的數(shù)據(jù)到MongoDB,具體批量存儲操作將會在4.6小節(jié)中實現(xiàn)。在MongoDBshell中實現(xiàn)存儲用戶日志數(shù)據(jù)到MongoDB,執(zhí)行結(jié)果如下圖。任務(wù)實現(xiàn)6目錄使用MongoDB
Java
API創(chuàng)建電子商務(wù)日志數(shù)據(jù)存儲系統(tǒng)查詢MongoDB中用戶訪問HTML頁5存儲用戶日志數(shù)據(jù)到MongoDB4當存儲用戶日志數(shù)據(jù)到MongoDB后,即可對日志數(shù)據(jù)進行統(tǒng)計分析。本小節(jié)的任務(wù)將通過查詢MongoDB中用戶訪問HTML頁面的記錄數(shù)介紹MongoDB查詢文檔、創(chuàng)建索引、分組聚合等操作。任務(wù)描述MongoDB使用find()方法查詢文檔。在上一小節(jié)中,使用了“db.demo_info.find()”命令查看集合“demo_info”中的所有文檔,這是find()方法的一個簡單示例。MongoDB查詢文檔數(shù)據(jù)的語法如下。db.collection.find(query,projection)該語句部分參數(shù)說明如下。query:可選,表示使用查詢操作符指定查詢條件,默認為無條件。projection:可選,表示篩選本次查詢指定返回的鍵,默認為返回文檔數(shù)據(jù)中所有鍵。查詢文檔數(shù)據(jù)根據(jù)上一小節(jié)創(chuàng)建的集合demo_info,查詢集合中鍵“id”對應(yīng)的值小于5的文檔數(shù)據(jù),僅返回鍵為“title”的鍵值對;查詢demo_info中鍵“titile”的值為“newdata”的文檔數(shù)據(jù),僅返回鍵為“id”的鍵值對。執(zhí)行結(jié)果如下圖所示,顯示“id”小于5的文檔數(shù)據(jù)“title”值均為“olddata”,而“title”值為“newdata”的文檔數(shù)據(jù)鍵“id”的值皆大于或等于5,查詢結(jié)果符合上一小節(jié)中demo_info對應(yīng)的文檔數(shù)據(jù)。查詢文檔數(shù)據(jù)索引通常能夠極大的提高查詢的效率,如果沒有索引,那么MongoDB在查詢數(shù)據(jù)時必須掃描集合中的每個文件并選取符合查詢條件的記錄。這種掃描全集合的方式在處理大量的數(shù)據(jù)時,查詢效率會比較低。因此為經(jīng)常查詢的數(shù)據(jù)創(chuàng)建相應(yīng)的索引是非常有必要的。MongoDB使用createIndex()方法來創(chuàng)建索引。MongoDB創(chuàng)建索引的語法如下。db.collection.createIndex(keys,options)該語句部分參數(shù)說明如下。keys:必選,key值為需要創(chuàng)建的索引字段,1為指定按升序創(chuàng)建索引,-1則為指定按降序創(chuàng)建索引。options:可選,表示在創(chuàng)建索引時的限制條件,默認為無限制條件。索引在默認數(shù)據(jù)庫test中,創(chuàng)建集合test_demo,使用循環(huán)向該集合插入50000條文檔數(shù)據(jù)。為該集合創(chuàng)建一個索引,查詢所有文檔數(shù)據(jù)中“id”等于1的文檔數(shù)據(jù),并使用explain()方法查看對比創(chuàng)建索引前后,查詢速度的變化。創(chuàng)建索引前,部分查詢執(zhí)行信息如左圖,創(chuàng)建索引后查詢執(zhí)行信息如右圖。索引查詢執(zhí)行信息的部分參數(shù)說明如下。nReturned:表示該查詢條件下返回的文檔數(shù)量。executionTimeMills:表示執(zhí)行時間,單位毫秒。totalDocsExamined:表示該集合總共文檔數(shù)。在無索引的情況下,查詢執(zhí)行時間為22毫秒,而加入索引后查詢執(zhí)行時間為18毫秒,查詢效率得到提升。由于在MongoDB中對海量數(shù)據(jù)添加相應(yīng)索引后將極大的提升這些數(shù)據(jù)的查詢效率,所以在MongoDB中對文檔數(shù)據(jù)添加相應(yīng)的索引是很有必要的。索引MongoDB使用aggregate()方法進行聚合操作。aggregate()方法主要用于處理數(shù)據(jù),如統(tǒng)計平均值、求和等,并返回計算后的數(shù)據(jù)結(jié)果,與SQL中的聚合概率相似。aggregate()方法的語法格式如下。db.collection_name.aggregate(aggregate_operation)該語句的參數(shù)解釋說明如下。aggregate_operation:必選,表示aggregate中的可使用的聚合運算符,如limit設(shè)置進入聚合處理的文檔數(shù),sort對處理的文檔進行排序等。這些運算符中使用最多的為group命令,group命令會將文檔進行分組,而且group可以結(jié)合相關(guān)的運算符對文檔進行計算。聚合aggregate聚合中g(shù)roup運算符常用的表達式如下表。使用aggregate聚合中的group運算符,按照鍵“title”的值分組統(tǒng)計demo_info集合中的記錄總數(shù),執(zhí)行結(jié)果如下圖所示。聚合表達式描述$sum計算總和。{$sum:1}表示返回總和×1的值(即總和的數(shù)量),使用{$sum:'$制定字段'}也能直接獲取制定字段的值的總和$avg計算平均值$min獲取最小值$max獲取最大值$push將聚合后的結(jié)果數(shù)據(jù)文檔中插入值到一個數(shù)組中$first根據(jù)文檔的排序獲取第一個文檔數(shù)據(jù)$last根據(jù)文檔的排序獲取最后一個數(shù)據(jù)按照用戶日志數(shù)據(jù)的“fullurl”分組,對分組結(jié)果進行去重統(tǒng)計,即可查詢MongoDB中用戶訪問HTML頁面的記錄數(shù),執(zhí)行結(jié)果如下圖所示。由于原始數(shù)據(jù)只有3條,所以在顯示的結(jié)果中,HTML頁面的訪問記錄數(shù)都為1。任務(wù)實現(xiàn)6目錄使用MongoDB
Java
API創(chuàng)建電子商務(wù)日志數(shù)據(jù)存儲系統(tǒng)查詢MongoDB中用戶訪問HTML頁5存儲用戶日志數(shù)據(jù)到MongoDB4以IDEA.2018.3.5版本為例,搭建MongoDB開發(fā)環(huán)境步驟如下。項目創(chuàng)建。在IDEA中創(chuàng)建一個新的Mavenproject,創(chuàng)建原型選擇“maven-archetype-quickstart”。MongoDB項目創(chuàng)建如右圖所示。搭建MongoDB的開發(fā)環(huán)境pom文件添加依賴。創(chuàng)建項目工程完成后,在pom文件中添加驅(qū)動程序依賴。完成前面的兩個步驟后,如果出現(xiàn)下圖所示的信息,那么說明成功創(chuàng)建Java連接MongoDB的開發(fā)環(huán)境。搭建MongoDB的開發(fā)環(huán)境Java連接到MongoDB有以下兩個先決條件。運行要連接的MongoDB部署。開發(fā)環(huán)境中存在MongoDB驅(qū)動程序。在Java中可以使用MongoClients.create()方法連接到MongoDB。MongoClients.create()方法的語法如下。MongoClientmongoClient=MongoClients.create("mongodb://host:27017");host為服務(wù)器IP,Linux系統(tǒng)可以在控制臺中輸入“ifconfig–a”查看本地IP地址,根據(jù)查詢到的IP后接MongoDB端口,MongoDB默認端口號為27017,如:30:27017,。創(chuàng)建電子商務(wù)日志數(shù)據(jù)存儲數(shù)據(jù)庫1.Java連接MongoDB通過上頁的步驟連接到MongoDB數(shù)據(jù)庫后,即可通過Java編程對MongoDB進行操作。MongoDBJava常用API如右表。創(chuàng)建電子商務(wù)日志數(shù)據(jù)存儲數(shù)據(jù)庫2.Java導(dǎo)入數(shù)據(jù)到MongoDB方法描述示例db.getCollection()連接到數(shù)據(jù)庫中的指定集合,若指定集合不存在則會新建db.getCollection("student");insertOne()向集合中插入單條數(shù)據(jù)insertOne(document);insertMany()向集合中批量插入數(shù)據(jù)insertMany(documents);updateOne()修改集合中第一條符合條件的數(shù)據(jù)updateOne(lt("age",15),newDocument("$set",newDocument("i",
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版?zhèn)€性化定制門窗安裝與綠色建材供應(yīng)合同2篇
- 二零二五版木地板工程進度與成本管理合同4篇
- 二零二五年度游戲角色形象授權(quán)合同4篇
- 二零二五年度嬰幼兒奶粉安全風(fēng)險評估與管理體系建設(shè)合同4篇
- 二零二五年度城市綠化景觀提升項目種植合同3篇
- 二零二五年度影視MV拍攝與藝人肖像權(quán)授權(quán)合同
- 二零二五年度木材貿(mào)易代理與倉儲管理合同3篇
- 二零二五年度人防工程防雷接地檢測合同2篇
- 二零二四年度信用證項下跨境貿(mào)易融資合同模板3篇
- 二零二四年度液化氣供應(yīng)與綜合能源服務(wù)合同范本3篇
- 2024-2025學(xué)年山東省濰坊市高一上冊1月期末考試數(shù)學(xué)檢測試題(附解析)
- 江蘇省揚州市蔣王小學(xué)2023~2024年五年級上學(xué)期英語期末試卷(含答案無聽力原文無音頻)
- 數(shù)學(xué)-湖南省新高考教學(xué)教研聯(lián)盟(長郡二十校聯(lián)盟)2024-2025學(xué)年2025屆高三上學(xué)期第一次預(yù)熱演練試題和答案
- 決勝中層:中層管理者的九項修煉-記錄
- 幼兒園人民幣啟蒙教育方案
- 臨床藥師進修匯報課件
- 軍事理論(2024年版)學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 《無人機法律法規(guī)知識》課件-第1章 民用航空法概述
- 政治丨廣東省2025屆高中畢業(yè)班8月第一次調(diào)研考試廣東一調(diào)政治試卷及答案
- 網(wǎng)絡(luò)設(shè)備安裝與調(diào)試(華為eNSP模擬器)整套教學(xué)課件
- 銀行卡凍結(jié)怎么寫申請書
評論
0/150
提交評論