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