MongoDB數(shù)據(jù)庫(kù)一(MongoDB數(shù)據(jù)庫(kù)管理)_第1頁(yè)
MongoDB數(shù)據(jù)庫(kù)一(MongoDB數(shù)據(jù)庫(kù)管理)_第2頁(yè)
MongoDB數(shù)據(jù)庫(kù)一(MongoDB數(shù)據(jù)庫(kù)管理)_第3頁(yè)
MongoDB數(shù)據(jù)庫(kù)一(MongoDB數(shù)據(jù)庫(kù)管理)_第4頁(yè)
MongoDB數(shù)據(jù)庫(kù)一(MongoDB數(shù)據(jù)庫(kù)管理)_第5頁(yè)
已閱讀5頁(yè),還剩122頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

MongoDB數(shù)據(jù)庫(kù)管理主講:李捷QQ:86267659個(gè)人主頁(yè):www.li-jie.me郵箱:lijie@單元目標(biāo)1.什么是NO-SQL?2.認(rèn)識(shí)MongoDB數(shù)據(jù)庫(kù)3.MongoDB的下載與安裝4.MongoDB的體系結(jié)構(gòu)5.客戶端GUI工具集合6.常用命令(基本的增刪改查)什么是NO-SQLNoSQL是反SQL運(yùn)動(dòng)的意思,它指的是非關(guān)系型的數(shù)據(jù)庫(kù),是以key-value形式存儲(chǔ),和傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)不一樣,不一定遵循傳統(tǒng)數(shù)據(jù)庫(kù)的一些基本要求,比如說(shuō)遵循SQL標(biāo)準(zhǔn)、ACID屬性、表結(jié)構(gòu)等等,這類數(shù)據(jù)庫(kù)主要有以下特點(diǎn):非關(guān)系型的、分布式的、開(kāi)源的、水平可擴(kuò)展的。NoSQL發(fā)展現(xiàn)狀目前國(guó)內(nèi)外正在應(yīng)用NoSQL的網(wǎng)站有:新浪微博 RedisGoogle

BigtableAmazon

SimpleDB淘寶數(shù)據(jù)平臺(tái) Tair

(淘寶自主開(kāi)發(fā)的Key/Value結(jié)構(gòu)數(shù)據(jù)存儲(chǔ)系統(tǒng))視覺(jué)中國(guó)網(wǎng)站 MongoDB

優(yōu)酷運(yùn)營(yíng)數(shù)據(jù)分析 MongoDB飛信空間 HandlerSocket豆瓣社區(qū) BeansDB

我們?yōu)槭裁匆褂肗OSQL非關(guān)系數(shù)據(jù)庫(kù)?一、對(duì)數(shù)據(jù)庫(kù)高并發(fā)讀寫的需求二、對(duì)海量數(shù)據(jù)的高效率存儲(chǔ)和訪問(wèn)的需求三、和高可用性的需求對(duì)數(shù)據(jù)庫(kù)的高可擴(kuò)展性NoSQL數(shù)據(jù)庫(kù)的優(yōu)缺點(diǎn)在優(yōu)勢(shì)方面,主要體現(xiàn)在下面這幾點(diǎn):簡(jiǎn)單的擴(kuò)展快速的讀寫低廉的成本靈活的數(shù)據(jù)模型在不足方面,常見(jiàn)主要有下面這幾點(diǎn):不提供對(duì)SQL的支持支持的特性不夠豐富現(xiàn)有產(chǎn)品的不夠成熟NOSQL的種類初始MongoDBMongoDB介紹MongoDB是什么?{“name”:”mongo”,”type”:”DB”}MongoDB(from“humongous”)Isascalable,high-performance,opensource,Document-orienteddatabase,WritteninC++是一個(gè)可擴(kuò)展,高性能,開(kāi)放源碼,面向文檔的數(shù)據(jù)庫(kù),使用C++編寫的淺談原理內(nèi)存映射存儲(chǔ)引擎MongoDB數(shù)據(jù)庫(kù)MongoDB是一個(gè)介于關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫(kù)當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫(kù)的。他支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是類似json的bson格式,因此可以存儲(chǔ)比較復(fù)雜的數(shù)據(jù)類型。Mongo最大的特點(diǎn)是他支持的查詢語(yǔ)言非常強(qiáng)大,其語(yǔ)法有點(diǎn)類似于面向?qū)ο蟮牟樵冋Z(yǔ)言,幾乎可以實(shí)現(xiàn)類似關(guān)系數(shù)據(jù)庫(kù)單表查詢的絕大部分功能,而且還支持對(duì)數(shù)據(jù)建立索引。它的特點(diǎn)是高性能、易部署、易使用,存儲(chǔ)數(shù)據(jù)非常方便。

MongoDB數(shù)據(jù)庫(kù)主要功能特性:◆面向集合存儲(chǔ),易存儲(chǔ)對(duì)象類型的數(shù)據(jù)“面向集合”(Collenction-Orented),意思是數(shù)據(jù)被分組存儲(chǔ)在數(shù)據(jù)集中,被稱為一個(gè)集合(Collenction)。每個(gè)集合在數(shù)據(jù)庫(kù)中都有一個(gè)唯一的標(biāo)識(shí)名,并且可以包含無(wú)限數(shù)目的文檔。集合的概念類似關(guān)系型數(shù)據(jù)庫(kù)(RDBMS)里的表(table),不同的是它不需要定義任何模式(schema)?!裟J阶杂赡J阶杂桑╯chema-free),意味著對(duì)于存儲(chǔ)在mongodb數(shù)據(jù)庫(kù)中的文件,我們不需要知道它的任何結(jié)構(gòu)定義。如果需要的話,你完全可以把不同結(jié)構(gòu)的文件存儲(chǔ)在同一個(gè)數(shù)據(jù)庫(kù)里?!糁С謩?dòng)態(tài)查詢◆支持完全索引,包含內(nèi)部對(duì)象

MongoDB數(shù)據(jù)庫(kù)◆支持查詢◆支持復(fù)制和故障恢復(fù)◆使用高效的二進(jìn)制數(shù)據(jù)存儲(chǔ),包括大型對(duì)象(如視頻等)◆自動(dòng)處理碎片,以支持云計(jì)算層次的擴(kuò)展性◆支持RUBY,PYTHON,JAVA,C++,PHP等多種語(yǔ)言◆文件存儲(chǔ)格式為BSON(一種JSON的擴(kuò)展)BSON(BinarySerializedDocumentFormat)存儲(chǔ)形式是指:存儲(chǔ)在集合中的文檔,被存儲(chǔ)為鍵-值對(duì)的形式。鍵用于唯一標(biāo)識(shí)一個(gè)文檔,為字符串類型,而值則可以是各中復(fù)雜的文件類型。MongoDB數(shù)據(jù)庫(kù)◆可通過(guò)網(wǎng)絡(luò)訪問(wèn)

MongoDB服務(wù)端可運(yùn)行在Linux、Windows或OSX平臺(tái),支持32位和64位應(yīng)用,默認(rèn)端口為27017。推薦運(yùn)行在64位平臺(tái),因?yàn)镸ongoDB在32位模式運(yùn)行時(shí)支持的最大文件尺寸為2GB。

MongoDB把數(shù)據(jù)存儲(chǔ)在文件中(默認(rèn)路徑為:/data/db),為提高效率使用內(nèi)存映射文件進(jìn)行管理。MongoDB數(shù)據(jù)庫(kù)面向集合(Collenction-Orented)意思是數(shù)據(jù)被分組存儲(chǔ)在數(shù)據(jù)集中被稱為一個(gè)集合(Collenction)。每個(gè)集合在數(shù)據(jù)庫(kù)中都有一個(gè)唯一的標(biāo)識(shí)名,并且可以包含無(wú)限數(shù)目的文檔。集合的概念類似關(guān)系型數(shù)據(jù)庫(kù)里的表,不同的是它不需要定義任何模式。MongoDB數(shù)據(jù)庫(kù)模式自由(schema-free)

意思是集合里面沒(méi)有列和行的概念,下面兩個(gè)記錄可以存在于同一個(gè)集合里面:

{“name":“mongo"}

{"age":25}MongoDB數(shù)據(jù)庫(kù)文檔型(documents)意思是我們存儲(chǔ)的數(shù)據(jù)是鍵-值對(duì)的集合,鍵是字符串,值可以是數(shù)據(jù)類型集合里的任意類型,包括數(shù)組和文檔,每一個(gè)文檔相當(dāng)于關(guān)系數(shù)據(jù)庫(kù)中的一條記錄。MongoDB介紹文檔是什么?這個(gè)Document,不是文件??!{“name”:”李捷”,”alias”:”李小帥”}NotJSON,BUTBSONMongoDB的體系結(jié)構(gòu)1、邏輯結(jié)構(gòu)關(guān)系對(duì)比關(guān)系型數(shù)據(jù)庫(kù):MySQL數(shù)據(jù)庫(kù)(database)、表(table)、記錄(rows)三個(gè)層次概念組成。非關(guān)系型數(shù)據(jù)庫(kù): MongoDB數(shù)據(jù)庫(kù)(database)、集合(collection)、文檔對(duì)象(document)三個(gè)層次概念組成。MongoDB里的集合對(duì)應(yīng)于關(guān)系型數(shù)據(jù)庫(kù)里的表,但是集合中沒(méi)有列、行和關(guān)系的概念,集合中只有文檔,一個(gè)文檔就相當(dāng)與一條記錄,這體現(xiàn)了模式自由的特點(diǎn)。2、數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)MySQL的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu): MySQL的每個(gè)數(shù)據(jù)庫(kù)存放在一個(gè)與數(shù)據(jù)庫(kù)同名的文件夾中,MySQL如果使用MyISAM存儲(chǔ)引擎,數(shù)據(jù)庫(kù)文件類型就包括.frm、.MYD、.MYI。MongoDB的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu): MongoDB的默認(rèn)數(shù)據(jù)目錄是/data/db,它負(fù)責(zé)存儲(chǔ)所有的MongoDB的數(shù)據(jù)文件。在MongoDB內(nèi)部,每個(gè)數(shù)據(jù)庫(kù)都包含一個(gè).ns文件和一些數(shù)據(jù)文件,而且這些數(shù)據(jù)文件會(huì)隨著數(shù)據(jù)量的增加而變得越來(lái)越多。所以如果系統(tǒng)中有一個(gè)叫做test的數(shù)庫(kù),那么構(gòu)成test這個(gè)數(shù)據(jù)庫(kù)的文件就會(huì)由test.ns,test.0,test.1等等組成。3、MongoDB數(shù)據(jù)類型

MongoDB的文檔使用BSON(BinaryJSON)來(lái)組織數(shù)據(jù),BSON類似于JSON,JSON只是一種簡(jiǎn)單的表示數(shù)據(jù)的方式,只包含了6種數(shù)據(jù)類型(null、布爾、數(shù)字、字符串、數(shù)組及對(duì)象),不能完全滿足復(fù)雜業(yè)務(wù)的需要,因此,BSON還提供日期、32位數(shù)字、64位數(shù)字等類型。以下對(duì)mongoDB的數(shù)據(jù)類型進(jìn)行簡(jiǎn)要說(shuō)明:

1、

nullnull類型用于表示空值或不存在的字段如:{“one”:null}2、

布爾類型

布爾類型有兩上值,’true’和’false’

如:{“one”:true}3、

32位整數(shù)

mongoDB的控制臺(tái)使用JS引擎進(jìn)行輸入,而JS僅支持64位浮點(diǎn)數(shù),所以32位整數(shù)將會(huì)被自動(dòng)轉(zhuǎn)義。4、

64位整數(shù)

64位整數(shù)與32位整數(shù)一樣,在MongoDB控制臺(tái)使用時(shí),會(huì)轉(zhuǎn)義成64位浮點(diǎn)數(shù)。5、

64位浮點(diǎn)數(shù)

MongoDB控制臺(tái)數(shù)字的默認(rèn)類型。如:{“one”:2.02}

{“one”:10}6、字符串

UTF-8字符串都可以表示為字符串類型的數(shù)據(jù)。如:{“one”:”HelloWorld”}7、

符號(hào)

在MongoDB控制臺(tái)中不支持這種類型,將自動(dòng)轉(zhuǎn)義成字符串。8、

ObjectId類型對(duì)象id是文檔中唯一的12位的ID

0|1|2|3|4|5|6|7|8|9|10|11時(shí)間戳

|機(jī)器

|PID|

計(jì)數(shù)器

如:ObjectId("4eae239f63520362e051e7fd")9、

日期注意:使用的時(shí)候要加上new如:{“one”:newDate()}

10、正則表達(dá)式

文檔鍵值可以包含正則表達(dá)式,其正則表達(dá)式采用JS語(yǔ)法來(lái)表示。如:{“one”:/ho/i}11、代碼

文檔中可以包含JS代碼

如:{“one”:function(){/*………….*/}}12、數(shù)組

文檔中鍵值可以表示為數(shù)組,在數(shù)組內(nèi)還可以嵌套數(shù)組;如:{“x”:[“a”,”b”,[“c”,”d”]]}13、內(nèi)嵌文檔

文檔可以包含別的文檔,也可以作為值嵌入到父文檔中。如:{“x”:{“name”:”Tom”,”age”:20}}MongoDB的安裝(Linux平臺(tái))第一步:下載MongoDB安裝包MongoDB的官網(wǎng):

找到相應(yīng)的版本下載。如果有網(wǎng)絡(luò)的話,用命令直接下載(CentOS版本)wget/linux/mongodb-linux-i686-1.8.0.tgzMongoDB的安裝(Linux平臺(tái))第二步:解壓壓縮包tarzxvfmongodb-linux-i686-2.0.2.tgz最好給解壓的文件夾改個(gè)名字,方便操作。mvmongodb-linux-i686-2.0.2mongodbMongoDB的安裝(Linux平臺(tái))第三步:安裝準(zhǔn)備將mongodb移動(dòng)到/usr/local/mongdb文件夾(跟據(jù)個(gè)人習(xí)慣指定) mvmongodb/usr/local/mongodb創(chuàng)建數(shù)據(jù)庫(kù)文件夾(默認(rèn)的數(shù)據(jù)庫(kù)文件的位置是/data/db,啟動(dòng)時(shí)會(huì)自動(dòng)創(chuàng)建) mkdir/usr/local/mongodb/data提示:mongoDB沒(méi)有具體的安裝過(guò)程,解壓文件包后,可以直接使用,非常高效和方便。MongoDB的安裝(Linux平臺(tái))第四步:開(kāi)機(jī)自啟動(dòng)將mongodb啟動(dòng)項(xiàng)目加入rc.local保證mongodb在服務(wù)器開(kāi)機(jī)時(shí)啟動(dòng)

echo"/usr/local/mongodb/bin/mongod--dbpath=/usr/local/mongodb/data">>/etc/rc.localMongoDB的安裝(Linux平臺(tái))第五步:?jiǎn)?dòng)mongodb運(yùn)行mongod命令--dbpath執(zhí)行數(shù)據(jù)庫(kù)存放路徑(默認(rèn)是/data/db)--fork是以Daemon(守護(hù)進(jìn)程)方式運(yùn)行,

注意:如果指定--fork參數(shù),必須指定--logpath 日志文件路徑/usr/local/mongodb/bin/mongod--dbpath=/usr/local/mongodb/data--fork --logpath=/usr/local/mongodb/dblogs不加--fork參數(shù)啟動(dòng)成功加--fork參數(shù)啟動(dòng)成功

注意:如果不加--fork參數(shù),則需要再開(kāi)啟一個(gè)MongoDB啟動(dòng)窗口。

啟動(dòng)命令常用參數(shù)選項(xiàng)說(shuō)明

--dbpath指定數(shù)據(jù)庫(kù)的目錄--port指定數(shù)據(jù)庫(kù)的端口,默認(rèn)是27017--bind_ip綁定IP--directoryperdb為每個(gè)db創(chuàng)建一個(gè)獨(dú)立子目錄--logpath指定日志存放目錄--logappend指定日志生成方式(追加/覆蓋)--pidfilepath指定進(jìn)程文件路徑,如果不指定,將不產(chǎn)生進(jìn)程文件--keyFile集群模式的關(guān)鍵標(biāo)識(shí)--journal啟用日志--nssize指定.ns文件的大小,單位MB,默認(rèn)是16M,最大是2GB--maxConns最大的并發(fā)連接數(shù)--notablescan不允許進(jìn)行表掃描--noprealloc關(guān)閉數(shù)據(jù)文件的預(yù)分配功能--fork以后臺(tái)Daemon形式運(yùn)行服務(wù)更多的參數(shù)選項(xiàng)利用mongod--help進(jìn)行查看MongoDB的安裝(Linux平臺(tái))第六步:進(jìn)入客戶端操作/usr/local/mongodb/bin/mongo(mongo命令)看到這個(gè)畫面:已經(jīng)進(jìn)入MongoDB的客戶端了,MongoDB的安裝也就完成了,就是這么簡(jiǎn)單。(默認(rèn)進(jìn)入的是test庫(kù))

MongoDB的安裝(Linux平臺(tái))第七步:退出shell控制臺(tái)Ctrl+c或exit回車如圖:第八步:停止MongoDB服務(wù)器如果處理連接狀態(tài),那么直接可以通過(guò)在admin庫(kù)中發(fā)送db.shutdownServer()指令去停止具體如下:MongoDB的安裝(Linux平臺(tái))Unix系統(tǒng)指令注意:

不要用kill-9PID來(lái)殺死MongoDB進(jìn)程,這樣可以會(huì)導(dǎo)致MongoDB的數(shù)據(jù)損壞,用kill-2殺死進(jìn)程。MongoDB的安裝(Linux平臺(tái))客戶端GUI工具集合 MongoDB常用的幾款GUI管理工具:MongoVUE主頁(yè):/

一個(gè)桌面程序,提供了對(duì)MongoDB數(shù)據(jù)庫(kù)的基,如查看、查詢、更新、刪除等,簡(jiǎn)單易用,但是功能還比較弱,以后發(fā)展應(yīng)該不錯(cuò)。RockMongo主頁(yè):/p/rock-php

RockMongo是一個(gè)PHP5寫的MongoDB管理工具。主要特征:使用寬松的NewBSDLicense協(xié)議速度快,安裝簡(jiǎn)單。支持多語(yǔ)言(目前提供中文、英文、日文、巴西葡萄牙語(yǔ)、法語(yǔ)、德語(yǔ))系統(tǒng)可以配置多個(gè)主機(jī),每個(gè)主機(jī)可以有多個(gè)管理員,需要管理員密碼才能登入操作,確保數(shù)據(jù)庫(kù)的安全性。

MongoHub 主頁(yè):/bububa/MongoHub

MongoHub是一個(gè)針對(duì)Mac平臺(tái)的MongoDB圖形管理客戶端,可用來(lái)管理MongoDB數(shù)據(jù)的應(yīng)用程序。常用命令控制臺(tái)中的基本操作命令

如果想查看當(dāng)前連接在哪個(gè)數(shù)據(jù)庫(kù)下面,可以直接輸入db查看用戶列表db.system.users.find();查看所有用戶showusers;查看所有數(shù)據(jù)庫(kù)showdbs;

查看所有集合showcollections;刪除當(dāng)前的數(shù)據(jù)庫(kù)

db.dropDatabase();刪除collectiondb.集合名.drop();想知道m(xù)ongodb支持哪些命令,可以直接輸入help;想知道當(dāng)前數(shù)據(jù)庫(kù)支持哪些方法:db.help();

想知道當(dāng)前集合支持哪些方法:db.user.help();user為集合名更多命令可以用幫助命令獲得!創(chuàng)建數(shù)據(jù)庫(kù),集合

由于Mongodb不是關(guān)系型數(shù)據(jù)庫(kù)文件,實(shí)際上,它并不存在傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)中的所謂“數(shù)據(jù)庫(kù)”的概念,當(dāng)你第一次新增數(shù)據(jù)時(shí),MongoDB就會(huì)以collection集合的形式進(jìn)行保存和新建,而不需要你提前去建立。

1)列出當(dāng)前的數(shù)據(jù)庫(kù)。使用mongo命令進(jìn)入數(shù)據(jù)庫(kù),使用showdbs命令查看所有的數(shù)據(jù)庫(kù),只有admin、local、2個(gè)數(shù)據(jù)庫(kù)。[root@localhost/]#mongoMongoDBshellversion:2.0.2connectingto:test>showdbsadmin(empty)local(empty)2)定義新的數(shù)據(jù)庫(kù)名。注意:在usemydb后,其實(shí)并沒(méi)有真正的建立起來(lái),只是表明在使用當(dāng)前的數(shù)據(jù)庫(kù)。>usemydbswitchedtodbmydb>showdbsadmin(empty)local(empty)3)保存數(shù)據(jù)。(隱式創(chuàng)建數(shù)據(jù)庫(kù)和集合)定義一個(gè)collection(集合),名為“users”,然后插入數(shù)據(jù):首先用insert語(yǔ)句插入一條數(shù)據(jù),使用的是users集合,插入成功后查看所有的庫(kù),多了個(gè)mydb的庫(kù),再查看所有集合,多了個(gè)users集合,再查看剛才添加的數(shù)據(jù),也可以查到。>db.users.insert({"_id":1,"name":"mongo"})>showdbsadmin(empty)local(empty)mydb0.0625GB>showcollectionssystem.indexesusers>db.users.find(){"_id":1,"name":"mongo"}數(shù)據(jù)庫(kù)基本操作:增查刪改添加數(shù)據(jù) 添加數(shù)據(jù)使用:關(guān)鍵字insert

或save 語(yǔ)法格式:

db.collname.insert({…})

db.collname.save({…})

>a={"name":"caida"}{"name":"caida"}>b={"age":24}{"age":24}>db.users.insert(a);>db.users.save(b);>db.users.find(){"_id":1,"name":"mongo"}{"_id":ObjectId("4eb2a192bf10550b2177b6f7"),"name":"caida"}{"_id":ObjectId("4eb2a199bf10550b2177b6f8"),"age":24}idkey

存儲(chǔ)在MongoDB集合中的每個(gè)文檔(document)都有一個(gè)默認(rèn)的主鍵_id,它必須是唯一的,這個(gè)主鍵名稱是固定的,它可以是MongoDB支持的任何數(shù)據(jù)類型,默認(rèn)是ObjectId。在關(guān)系數(shù)據(jù)庫(kù)的設(shè)計(jì)中,主鍵大多是數(shù)值型的,比如常用的int,并且更通常的是主鍵的取值由數(shù)據(jù)庫(kù)自增獲得,反觀MongoDB,它在設(shè)計(jì)之初就定位于分布式存儲(chǔ)系統(tǒng),所以它原生的不支持自增主鍵。

在這里給大家提出一個(gè)方案: 自己定義一個(gè)函數(shù),來(lái)讓它實(shí)現(xiàn)id自增。 如圖中代碼:在插入_id時(shí)調(diào)用自己定義的函數(shù)。functioncounter(name){varret=db.counters.findAndModify({query:{_id:name},update:{$inc:{next:1}},"new":true,upsert:true});returnret.next;}

db.users.insert({_id:counter("users"),name:"id1"})//_id:1db.users.insert({_id:counter("users"),name:"id2"})//_id:2刪除數(shù)據(jù)

刪除數(shù)據(jù)使用:關(guān)鍵字remove語(yǔ)法格式:db.collname.remove({條件})(不寫條件刪除所有記錄)注意:{}中也就是第一個(gè)參數(shù),是要指定的刪除條件。>db.users.remove({"name":"caida"})>db.users.find(){"_id":1,"name":"mongo"}{"_id":ObjectId("4eb2a199bf10550b2177b6f8"),"age":24}修改數(shù)據(jù)修改數(shù)據(jù)使用:關(guān)鍵字update語(yǔ)法格式:db.collname.update({條件})和刪除一樣,第一個(gè)參數(shù)里面是條件匹配

>db.users.update({"_id":1},{"name":"nosql"})>db.users.find(){"_id":1,"name":"nosql"}{"_id":ObjectId("4eb2a199bf10550b2177b6f8"),"age":24}使用修改器:1.$set修改器db.user.update({“_id”:ObjectId(“..”)},{“$set”:{name:”user1”}})2.$unset修改器db.user.update({name:”user1”},{$unset:{age:1}})3.$inc增加或減少1db.user.update({name:”user1”},{$inc:{age:1}})數(shù)組修改器:1.$push修改器$pushAll向數(shù)組末尾加入一個(gè)元素,如果沒(méi)有就創(chuàng)建一個(gè)新的數(shù)組db.user.update({name:”user1”},{$push:{hobby:”football”}})2.$addToSet修改器判斷一個(gè)值不在數(shù)組中就插入,存在的話不執(zhí)行插入db.user.update({name:”user1”},{$addToSet:{hobby:”sing”}})相當(dāng)于:db.user.update({name:”user1”,hobby:{$ne:”sing”}},{$push:{hobby:”sing”}})數(shù)組修改器:3.將$addToSet和$each組合起來(lái),可以添加多個(gè)不同的值db.user.update({“_id”:ObjectId(”…”)},{$addToSet:{email:{$each:[“haha@163.com”,”haha@”]}}})這種情況下,使用$ne和$push是無(wú)法實(shí)現(xiàn)的。4.$pop修改器可以從數(shù)組的任何一端刪除元素$pop:{key:1}從數(shù)組末尾刪除一個(gè)元素$pop:{key:-1}從數(shù)組開(kāi)頭刪除一個(gè)元素5.$pull修改器$pullAll基于特定條件刪除元素$pull:{hobby:”football”}數(shù)組修改器:6.數(shù)組的定位修改器$若數(shù)組有多個(gè)值,我們可以通過(guò)下標(biāo)直接作為鍵來(lái)選擇元素users:[{name:”user1”,},{name:”user2”},{name:”user3”}]db.c1.update({title:”haha”},{$set:{:”user4”}})這樣通過(guò)下標(biāo)取很不方便。db.c1.update({:”user1”},{$set:{users.$.name:”user4”}})Upsert:Upsert是一種特殊的更新,要是沒(méi)有文檔符合更新條件,就創(chuàng)建一個(gè)新文檔,如果找到了匹配的文檔,則正常更新。db.user.update({name:”user1”},{name:”user2”},true)如果沒(méi)有以name:”user1”為條件的記錄,那么就以name:”user1”這個(gè)條件和更新文檔name:”user2”為基礎(chǔ)創(chuàng)建文檔,也就是說(shuō),先創(chuàng)建一個(gè)name:”user1”的文檔,然后再更新name:”user1”為name:”user2”。又例:db.math.remove();db.math.update({count:25},{$inc:{count:3}},true)先清空文檔,創(chuàng)建一個(gè)以”count”的值為25的文檔,隨后將這個(gè)值加3,最終得到count為28。Save:Save是一個(gè)shell函數(shù),相當(dāng)于upsertvarx=db.user.findOne()x.num=42db.user.save(x)要是這個(gè)文檔含有”_id”鍵,save會(huì)調(diào)用upsert,否則會(huì)調(diào)用插入。等價(jià)于:db.user.update({_id:x._id},x)更新多個(gè)文檔:默認(rèn)情況下,更新只能對(duì)符合匹配條件的第一個(gè)文檔執(zhí)行操作。要是有多個(gè)文檔符合條件,其余的文檔不做變化,要是所有匹配到的文檔都得到更新,可以設(shè)置update的第4個(gè)參數(shù)為true。例如:假設(shè)要給所有在特定日期過(guò)生日的用戶一份禮物,就可以使用多文檔更新,將gift增加到他們的賬號(hào)。db.user.update({birthday:”12/21/2012”},{$set:{gift:”happybirthday”}},false,true)這樣就給生日為2012年12月21日的所有用戶文檔增加了“gift”鍵。想要知道多文檔更新到底更新了多少文檔,可以運(yùn)行g(shù)etLastError命令db.user.update({birthday:”12/21/2012”},{$set:{gift:”happybirthday”}},false,true)db.runCommand({getLastError:1});查詢數(shù)據(jù)修改數(shù)據(jù)使用:關(guān)鍵字find

或findOne(查詢一條)語(yǔ)法格式:db.collname.find({條件})(不寫條件查詢所有的數(shù)據(jù))>db.users.find(){"_id":1,"name":"nosql"}{"_id":ObjectId("4eb2a199bf10550b2177b6f8"),"age":24}>db.users.find({"name":"nosql"}){"_id":1,"name":"nosql"}指定返回的鍵:db.user.find({name:”user1”},{“name”:1,”_id”:0})查詢的結(jié)果只返回name查詢條件:$lt,$gt,$lte,$gte,$ne:db.user.find({“age”:{“$gt”:20,”$lte”:50}})例如:要查找在2012年12月21日前注冊(cè)的人,可以像下面這樣:start=newDate(“12/21/2012”)db.user.find({“registered”:{“$lt”:start}})OR查詢:$in,$or$in針對(duì)同一鍵的不同值,相同的還有$nin$or針對(duì)不同鍵例如:db.user.find({“age”:{“$in”:[10,20]}})db.user.find({“age”:{“$nin”:[20,30]}})db.user.find({“$or”:[{“name”:”user1”},{“age”:20}]})db.user.find({“$or”:[{“name”:{“$in”:[“user1”,”user2”]}},{“age”:20}]})查詢條件:$not$mod$not:取反$mod:取模例如:db.user.find({“id_num”:{“$mod”:[5,1]}})返回id_num除以5余1的條件成立的結(jié)果db.user.find({“id_num”:{“$not”:{“$mod”:[5,1]}}})返回id_num除以5不余1的條件成立的結(jié)果查詢條件:$exists判斷鍵值是否存在例如:db.user.find({“y”:{“$in”:[null],$exists:1}})顯示y鍵存在并且值為null的結(jié)果正則表達(dá)式:正則表達(dá)式能夠靈活有效地匹配字符串。db.user.find({“name”:/jiege/i})查詢數(shù)組:$all如果需要通過(guò)多個(gè)元素來(lái)匹配數(shù)組,就要用$all了,這樣就會(huì)匹配一組元素。db.food.find({fruit:{$all:[“apple”,”banana”]}})$size:查詢指定長(zhǎng)度的數(shù)組。db.food.find({“fruit”:{“$size”:3}})$slice操作符$slice返回?cái)?shù)組的一個(gè)子集合。例如:假設(shè)有一個(gè)博客文章的文檔,要想返回前10條評(píng)論db.blog.posts.findOne({“title”:”123”},{“comm”:{“$slice”:10}})db.blog.posts.findOne({“title”:”123”},{“comm”:{“$slice”:-10}})-10表示顯示后10條“$slice”:[20,10]返回從21~30條的評(píng)論$elemMatch匹配數(shù)組中的單個(gè)內(nèi)嵌文檔的限定條件。例如:現(xiàn)有博客文章若干,要找到由Joe發(fā)表的5分以上的評(píng)論。db.blog.find(){ “content”:”…”, “comments”:[ { “author”:”jiege”, “score”:5 } ]}db.blog.find({“comments”:{“$elemMatch”:{“author”:”jiege”,”score”:{“$gte”:5}}}})$where用“$where”子句可以執(zhí)行任意JS作為查詢的一部分。最典型的應(yīng)用就是比較文檔中的兩個(gè)鍵的值是否相等。例如:有個(gè)條目列表,如果其中的兩個(gè)值相等則返回文檔。db.foo.insert({“apple”:1,”banana”:6,”peach”:3})db.foo.insert({“apple”:8,”peach”:4,”watermelon”:4})在第二個(gè)文檔中,”peach”和”watermelon”的值相同,所以需要返回該文檔。不是非常必要時(shí),一定要避免使用”$where”查詢,因?yàn)樗谒俣壬弦瘸R?guī)查詢慢很多。db.food.find({“$where”:function(){ for(varcurrentinthis){ for(varotherinthis){ if(current!=other&&this[current]==this[other]){returntrue; } } } returnfalse;}});游標(biāo):數(shù)據(jù)庫(kù)使用游標(biāo)來(lái)返回find的執(zhí)行結(jié)果,客戶端對(duì)游標(biāo)的實(shí)現(xiàn)通常能夠?qū)ψ罱K結(jié)果進(jìn)行有效的控制。for(i=0;i<100;i++){ db.c.insert({x:i});}varcursor=db.collection.find();while(cursor.hasNext()){ obj=cursor.next();}Cursor.hasNext()檢查是否有后續(xù)結(jié)果存在,然后使用cursor.next()將其獲得。Limit:要限制結(jié)果數(shù)量,可以在find()后面使用limit函數(shù)。例如:只返回3個(gè)結(jié)果db.c.find().limit(3)Skip:要略過(guò)前n個(gè)文檔結(jié)果,返回余下的文檔,需要使用skip函數(shù)例如:從第四個(gè)文檔開(kāi)始返回db.c.find().skip(3)用skip略過(guò)少量的文檔還是不錯(cuò)的,但是要是數(shù)量非常多的話,skip就會(huì)變得很慢,所以要盡量避免。Sort:Sort用一個(gè)對(duì)象作為參數(shù):一組鍵/值對(duì),鍵對(duì)應(yīng)文檔的鍵名,值代表排序的方向,1為升序,-1為降序。如果指定了多個(gè)鍵,則按照多個(gè)鍵的順序逐個(gè)排序。例如:要按照“username”升序及“age”降序排序,可以這樣寫。db.c.find().sort({username:1,age:-1})不用skip對(duì)結(jié)果分頁(yè):例如:要按照“date”降序顯示文檔??梢杂萌缦路绞将@取結(jié)果的第一頁(yè):varpage1=db.foo.find().sort({“date”:-1}).limit(100)然后,可以利用最后一個(gè)文檔中“date”的值作為查詢條件,來(lái)獲取下一頁(yè):varlatest=null;while(page1.hasNext()){ latest=page1.next(); display(latest);}varpage2=db.foo.find({“date”:{“$gt”:latest.date}});page2.sort({“date”:-1}).limit(100);索引:創(chuàng)建索引要使用ensureIndex方法:db.user.ensureIndex({“username”:1})對(duì)于同一個(gè)集合,同樣的索引只需要?jiǎng)?chuàng)建一次,反復(fù)創(chuàng)建是徒勞的。創(chuàng)建索引的缺點(diǎn)就是每次插入、更新和刪除時(shí)都會(huì)產(chǎn)生額外的開(kāi)銷。這是因?yàn)閿?shù)據(jù)庫(kù)不但需要執(zhí)行這些操作,還要將這些操作在集合的索引中標(biāo)記。因此要盡可能少創(chuàng)建索引。為內(nèi)嵌文檔的鍵建立索引和為普通的鍵建立索引沒(méi)有什么區(qū)別。db.blog.ensureIndex({“comments.date”:1})索引方向:傳遞給ensureIndex的文檔形式是:一組值為1或-1的鍵,表示索引創(chuàng)建的方向。若索引只有一個(gè)鍵,則方向無(wú)關(guān)緊要。若有多個(gè)鍵,就要考慮方向問(wèn)題了。例如:現(xiàn)需要對(duì)用戶名進(jìn)行升序搜索,對(duì)年齡做降序搜索db.user.ensureIndex({“name”:1,”age”:-1})

索引名稱:ensureIndex可以指定索引的名稱:db.user.ensureIndex({“name”:1},{”name”:”index_name”})唯一索引:db.user.ensureIndex({“username”:1},{“unique”:true})創(chuàng)建唯一索引時(shí)刪除重復(fù)文檔:db.user.ensureIndex({“username”:1},{“unique”:true,”dropDups”:true})Explain:Explain會(huì)返回查詢使用的索引情況(如果有的話),耗時(shí)及掃描文檔數(shù)的統(tǒng)計(jì)信息。db.user.find().explain()索引管理:索引的元信息存儲(chǔ)在每個(gè)數(shù)據(jù)庫(kù)的system.indexes集合中。刪除索引:db.runCommand({“dropIndexes”:”user”,”index”:”name”})db.user.dropIndex({“name”:1})db.user.dropIndexes()聚合:CountCount是最簡(jiǎn)單的聚合工具,返回集合中的文檔數(shù)量。db.user.count();db.user.insert({“x”:1})db.user.count()也可以傳遞查詢,Mongo則會(huì)計(jì)算查詢結(jié)果的數(shù)量:db.user.insert({“x”:2})db.user.count()db.user.count({“x”:1}) 增加查詢條件會(huì)使得count變慢Distinct:用來(lái)找出給定鍵的所有不同的值,使用時(shí)必須制定集合和鍵。db.runCommand({“distinct”:”people”,”key”:”age”})例如:獲取所有不同的年齡{“name”:”Ada”,”age”:20}{“name”:”fred”,”age”:30}{“name”:”susan”,”age”:20}{“name”:”andy”,”age”:15}db.runCommand({“distinct”:”people”,”key”:”age”}){“values”:[15,20,30],”ok”:1}數(shù)據(jù)庫(kù)命令:getLastError:來(lái)查看一個(gè)更新對(duì)多少個(gè)文檔起作用:db.count.update({x:1},{$inc:{x:1}},false,true)db.runCommand({getLastError:1})Drop:刪除一個(gè)集合,等同于drop()db.$cmd.findOne({“drop”:”test”})db.collname.drop()訪問(wèn)有些命令需要有管理員權(quán)限,必須在admin數(shù)據(jù)庫(kù)里面運(yùn)行,如果在別的數(shù)據(jù)庫(kù)里運(yùn)行這樣的命令,會(huì)得到“拒絕訪問(wèn)”的錯(cuò)誤。性能優(yōu)化explain執(zhí)行計(jì)劃

MongoDB提供了一個(gè)explain命令讓我們獲知系統(tǒng)如何處理查詢請(qǐng)求。利用explain命令我們可以很好地觀察系統(tǒng)如何使用索引來(lái)加快檢索,同時(shí)可以針對(duì)性優(yōu)化索引。

>db.t5.ensureIndex({name:1})>db.t5.ensureIndex({age:1})>db.t5.find({age:{$gt:45}},{name:1}).explain(){"cursor":"BtreeCursorage_1", 返回游標(biāo)類型(BasicCursor或BtreeCursor)"nscanned":0, 被掃描的文檔數(shù)量"nscannedObjects":0,"n":0, 返回的文檔數(shù)量"millis":0, 耗時(shí)(毫秒)"nYields":0,"nChunkSkips":0,"isMultiKey":false,"indexOnly":false,"indexBounds":{ 所使用的索引"age":[[45,1.7976931348623157e+308]]

}}CappedCollection固定集合簡(jiǎn)單介紹 cappedcollections是性能出色的有著固定大小的集合,以LRU(LeastRecentlyUsed最近最少使用)規(guī)則和插入順序進(jìn)行age-out(老化移出)處理,自動(dòng)維護(hù)集合中對(duì)象的插入順序,在創(chuàng) 建時(shí)要預(yù)先指定大小。如果空間用完,新添加的對(duì)象將會(huì)取代集合中最舊的對(duì)象。

永遠(yuǎn)保持最新的數(shù)據(jù)。功能特點(diǎn) 可以插入及更新,但更新不能超出collection的大小,否則更新失敗。不允許刪除,但是可以調(diào)用drop()刪除集合中的所有行,但是drop后需要顯式地重建集合。在32位機(jī)上一個(gè)cappedcollection的最大值約482.5M,64位上只受系統(tǒng)文件大小的限制。

屬性及用法屬性1:對(duì)固定集合進(jìn)行插入速度極快屬性2:按照插入順序的查詢輸出速度極快。屬性3:能夠在插入最新數(shù)據(jù)時(shí),淘汰最早的數(shù)據(jù)。用法1:儲(chǔ)存日志信息。用法2:緩存一些少量的文檔。創(chuàng)建固定集合不像普通集合,固定集合需要顯式的創(chuàng)建使用createCollection命令來(lái)創(chuàng)建。db.createCollection(“my_collection”,{capped:true,size:10000})創(chuàng)建一個(gè)集合為‘my_collection’的固定集合,大小為10000字節(jié)。還可以限定文檔個(gè)數(shù)。加上Max:100屬性。注意:指定文檔上限,必須指定大小。文檔限制是在容量沒(méi)滿時(shí)進(jìn)行淘汰,要是滿了,就根據(jù)容量限制來(lái)進(jìn)行淘汰。轉(zhuǎn)換集合把普通的集合轉(zhuǎn)換成固定集合需要使用convertToCapped命令db.runCommand({convertToCapped:”test”,size:10000})把test普通集合轉(zhuǎn)換為固定集合,大小為10000字節(jié)。自然排序固定集合文檔按照插入順序儲(chǔ)存的,默認(rèn)情況下查詢就是按照插入順序返回的,也可以使用$natural

調(diào)整返回順序。db.my_collection.find().sort({“$natural”:1})1表示默認(rèn)順序,-1則相反。GridFSGridFS是一種在MongoDB中存儲(chǔ)大二進(jìn)制文件的機(jī)制,使用GridFS的原因有以下幾種:儲(chǔ)存巨大的文件,比如視頻、高清圖片等。利用GridFS可以簡(jiǎn)化需求。GridFS會(huì)直接利用已經(jīng)建立的復(fù)制或分片機(jī)制,故障恢復(fù)和擴(kuò)展都很容易。GridFS可以避免用戶上傳內(nèi)容的文件系統(tǒng)出現(xiàn)問(wèn)題。GridFS不產(chǎn)生磁盤碎片。GridFS使用兩個(gè)表來(lái)存儲(chǔ)數(shù)據(jù):

files

包含元數(shù)據(jù)對(duì)象chunks

包含其他一些相關(guān)信息的二進(jìn)制塊 為了使多個(gè)GridFS命名為一個(gè)單一的數(shù)據(jù)庫(kù),文件和塊都有一個(gè)前綴,默認(rèn)情況下,前綴是fs,所以任何默認(rèn)的GridFS存儲(chǔ)將包括命名空間fs.files

和fs.chunks。各種第三方語(yǔ)言可以更改其前綴。使用GridFS

mongofilesmongofiles是從命令行操作GridFS的一種工具

三個(gè)命令:put(存儲(chǔ))get(取得)list(列表)例如:我們將”testfile”這個(gè)文件存到庫(kù)里面,具體用法如下:[root@localhostbin]#./mongofilesputtestfileconnectedto:addedfile:{_id:ObjectId('4fc60175c714c5d960fff76a'),filename:"testfile",chunkSize:262144,uploadDate:newDate(1338376565745),md5:"8addbeb77789ae6b2cb75deee30faf1a",length:16}done!下面我們查一下看庫(kù)里有哪些GridFS文件,在”mongofiles”后加一個(gè)參數(shù)”list”即可接下來(lái)我們進(jìn)庫(kù)里看一下是否有新的東西[root@localhostbin]#./mongofileslistconnectedto:testfile16--大小>showcollectionsfs.chunks--上文提到的fs.chunksfs.files--上文提到的fs.files我們繼續(xù)查看fs.files中的內(nèi)容字段說(shuō)明:Filename: 存儲(chǔ)的文件名chunkSize: chunks分塊的大小uploadDate: 入庫(kù)時(shí)間md5: 此文件的md5碼length: 文件大小,單位”字節(jié)”fs.files中存儲(chǔ)的是一些基礎(chǔ)的元數(shù)據(jù)信息db.fs.files.find(){"_id":ObjectId("4fc60175c714c5d960fff76a"),"filename":"testfile","chunkSize":262144,"uploadDate":ISODate("2012-05-30T11:16:05.745Z"),"md5":"8addbeb77789ae6b2cb75deee30faf1a","length":16}我們繼續(xù)查看中的內(nèi)容_id: 塊自身的idfiles_id: 包含這個(gè)塊的元數(shù)據(jù)文檔文件idn: 它代表的是chunks的序號(hào),此序號(hào)從0開(kāi)data:組成文件塊的二進(jìn)制文件fs.chunks中存儲(chǔ)的是一些實(shí)際的內(nèi)容數(shù)據(jù)信息>db.fs.chunks.find(){"_id":ObjectId("4fc60175cf1154905d949336"),"files_id":ObjectId("4fc60175c714c5d960fff76a"),"n":0,"data":BinData(0,"SGVyZSBpcyBCZWlqaW5nCg==")}我們即然能將此文件存進(jìn)去,我們就應(yīng)該有辦法將其取出來(lái),下面看一下實(shí)例:[root@localhostbin]#rmtestfilerm:是否刪除一“testfile”?y --先刪文件[root@localhostbin]#./mongofilesgettestfile --將其從庫(kù)里取出來(lái)connectedto:donewriteto:testfile[root@localhostbin]#md5sumtestfile --校驗(yàn)md5,結(jié)果跟庫(kù)里相同GridFS:存儲(chǔ)文件上傳文件:Mongofilesputfoo.txt查看文件:Mongofileslist下載文件:Mongofilesgetfoo.txt搜索文件:Search用來(lái)按文件名查找GridFS中的文件刪除文件:Delete是從GridFS中刪除一個(gè)文件。優(yōu)化器profileMongoDBDatabaseProfiler

是一種慢查詢?nèi)罩竟δ埽梢宰鳛槲覀儍?yōu)化數(shù)據(jù)庫(kù)的依據(jù)。

開(kāi)啟Profiling功能有兩種方式可以控制Profiling的開(kāi)關(guān)和級(jí)別。啟動(dòng)MongoDB時(shí)加上–profile=級(jí)別即可。在客戶端調(diào)用db.setProfilingLevel(級(jí)別)命令來(lái)實(shí)時(shí)配置。Profiler信息保存在file

中。我們可以通過(guò)db.getProfilingLevel()命令來(lái)獲取當(dāng)前的Profile級(jí)別.具體操作:上面profile的級(jí)別可以取0,1,2三個(gè)值,它們的表示:0–

不開(kāi)啟1–

記錄慢命令(默認(rèn)為>100ms)2–

記錄所有命令>db.setProfilingLevel(2);

{"was":0,"slowms":100,"ok":1}>db.getProfilingLevel();2Profile在級(jí)別1時(shí)會(huì)記錄慢命令,上面的默認(rèn)值為100ms,有默認(rèn)就有設(shè)置,其設(shè)置方法和級(jí)別有兩種方法:一種是通過(guò)添加–slowms

啟動(dòng)參數(shù)配置。db.setProfilingLevel時(shí)加上第二個(gè)參數(shù)。那么這個(gè)慢的定義是什么?可以理解比較耗時(shí)的命令,如一個(gè)查詢耗時(shí)10毫秒,就會(huì)被記錄下來(lái)。db.setProfilingLevel(1,10);查看具體信息:字段說(shuō)明:ts: 該命令在何時(shí)執(zhí)行info:

本命令的詳細(xì)信息reslen: 返回結(jié)果集的大小nscanned: 本次查詢掃描的記錄數(shù)nreturned: 本次查詢實(shí)際返回的結(jié)果集millis: 該命令執(zhí)行耗時(shí),以毫秒記

一個(gè)比較簡(jiǎn)潔的命令showProfile,可列出最近5

條執(zhí)行時(shí)間超過(guò)1ms的Profile記錄>file.find().sort({$natural:-1}).limit(1){"ts":ISODate("2012-05-20T16:50:36.321Z"),"info":"queryfilereslen:1219nscanned:8\nquery:{query:{},orderby:{$natural:-1.0}}nreturned:8bytes:1203","millis":0}優(yōu)化方案1:創(chuàng)建索引在查詢條件的字段上,或者排序條件的字段上創(chuàng)建索引,可以顯著提高執(zhí)行效率。db.posts.ensureIndex({ts:1});

優(yōu)化方案2:限定返回結(jié)果條數(shù)使用limit()限定返回結(jié)果集的大小,可以減少databaseserver的資源消耗,可以減少網(wǎng)絡(luò)傳輸數(shù)據(jù)量。db.posts.find().sort({ts:-1}).limit(10);

優(yōu)化方案3:查詢使用到的字段,不查詢所有字段優(yōu)化方案4:采用cappedcollectioncappedCollections比普通Collections的讀寫效率高優(yōu)化方案5:采用ProfilingProfiling功能肯定是會(huì)影響效率的,但是不太嚴(yán)重,原因是他使用的是file來(lái)記錄,file是一個(gè)cappedcollection這種collection在操作上有一些限制和特點(diǎn),但是效率更高。db.posts.find({},{ts:1,title:1,author:1,abstract:1}).sort({ts:-1}).limit(10);性能監(jiān)控通過(guò)對(duì)數(shù)據(jù)庫(kù)的性能監(jiān)控,能夠更好的了解數(shù)據(jù)庫(kù)的工作狀態(tài),從而進(jìn)行優(yōu)化。介紹幾個(gè)性能監(jiān)控的工具:Mongosniff此工具可從底層監(jiān)控到底有哪些命令發(fā)送給MongoDB去執(zhí)行。./mongosniff--sourceNETlo

它是實(shí)時(shí)動(dòng)態(tài)監(jiān)視的,需要打開(kāi)另一個(gè)客戶端進(jìn)行命令操??梢詫⑦@些數(shù)據(jù)輸出到一個(gè)日志文件中,那么就可以保留下所有數(shù)據(jù)庫(kù)操作的歷史記錄,對(duì)于后期的性能分析和安全審計(jì)等工作將是一個(gè)巨大的貢獻(xiàn)。。Mongostat此工具可以快速的查看某組運(yùn)行中的MongoDB實(shí)例的統(tǒng)計(jì)信息,也需要在打開(kāi)一個(gè)客戶端進(jìn)行命令操作:用法如下:[root@localhostbin]#./mongostat

下面是執(zhí)行結(jié)果(部分):

[root@localhostbin]#./mongostatinsertqueryupdatedeletelocked%idxmiss%qr|qwar|awconntime*0*0*0*0000|01|0401:19:15*0*0*0*0000|01|0401:19:16*0*0*0*0000|01|0401:19:17字段說(shuō)明:

insert: 每秒插入量query: 每秒查詢量update: 每秒更新量delete: 每秒刪除量locked: 鎖定量qr|qw:客戶端查詢排隊(duì)長(zhǎng)度(讀|寫)ar|aw:活躍客戶端量(讀|寫)conn: 連接數(shù)time: 當(dāng)前時(shí)間它每秒鐘刷新一次狀態(tài)值,提供良好的可讀性,通過(guò)這些參數(shù)可以觀察到一個(gè)整體的性能情況。db.serverStatus()這個(gè)命令是最常用也是最基礎(chǔ)的查看實(shí)例運(yùn)行狀態(tài)的命令之一,下面我們看一下它的輸出:>db.serverStatus(){"host":"localhost.localdomain","version":"1.8.1",--服務(wù)器版本

"process":"mongod","uptime":3184,--啟動(dòng)時(shí)間(秒)"uptimeEstimate":3174,"localTime":ISODate("2012-05-28T11:20:22.819Z"),"globalLock":{"totalTime":3183918151,"lockTime":10979,"ratio":0.000003448267034299149,"currentQueue":{"total":0,--當(dāng)前全部隊(duì)列量

"readers":0,--讀請(qǐng)求隊(duì)列量。。。。。。。db.statsdb.stats查看數(shù)據(jù)庫(kù)狀態(tài)信息。使用樣例如下:

>db.stats(){"db":"test","collections":7,--collection數(shù)量

"objects":28,--對(duì)象數(shù)量

"avgObjSize":50.57142857142857,--對(duì)象平均大小

"dataSize":1416,--數(shù)據(jù)大小

"storageSize":31744,--數(shù)據(jù)大小(含預(yù)分配空間)"numExtents":7,--事件數(shù)量

"indexes":7,--索引數(shù)量

"indexSize":57344,--索引大小

"fileSize":50331648,--文件大小

"ok":1--stats是否正常}第三方工具:MongoDB從一面世就得到眾多開(kāi)源愛(ài)好者和團(tuán)隊(duì)的重視,在常用的監(jiān)控框架如cacti、Nagios、Zabbix

等基礎(chǔ)上進(jìn)行擴(kuò)展,進(jìn)行MongoDB的監(jiān)控都是非常方便的。數(shù)據(jù)導(dǎo)出、數(shù)據(jù)導(dǎo)入 作為DBA(管理員),經(jīng)常會(huì)碰到導(dǎo)入導(dǎo)出數(shù)據(jù)的需求,下面就介紹實(shí)用工具:數(shù)據(jù)導(dǎo)出

mongoexport數(shù)據(jù)導(dǎo)入

mongoimport

數(shù)據(jù)導(dǎo)出命令mongoexport假設(shè)庫(kù)里有一張user表,里面有2條記錄,我們要將它導(dǎo)出

>usemy_mongodbswitchedtodbmy_mongodb>db.user.find();{"_id":ObjectId("4f81a4a1779282ca68fd8a5a"),"uid":2,"username":"Jerry","age":100}{"_id":ObjectId("4f844d1847d25a9ce5f120c4"),"uid":1,"username":"Tom","age":25}常用導(dǎo)出方法參數(shù)說(shuō)明:-d指明使用的庫(kù),“my_mongodb”

-c指明要導(dǎo)出的表,“user”

-o指明要導(dǎo)出的文件名,“user.dat”

從上面可以看到導(dǎo)出的方式使用的是JSON的樣式

[root@localhostbin]#./mongoexport-dmy_mongodb-cuser-ouser.dat

connectedto:exported2records[root@localhostbin]#catuser.dat{"_id":{"$oid":"4f81a4a1779282ca68fd8a5a"},"uid":2,"username":"Jerry","age":100}{"_id":{"$oid":"4f844d1847d25a9ce5f120c4"},"uid":1,"username":"Tom","age":25}導(dǎo)出CSV格式的文件參數(shù)說(shuō)明:-csv指要要導(dǎo)出為csv格式-f指明需要導(dǎo)出哪些例更詳細(xì)的用法可以mongoexport–help查看

[root@localhostbin]#./mongoexport-dmy_mongodb-cuser--csv-fuid,username,age

-ouser_csv.datconnectedto:exported2records[root@localhostbin]#catuser_csv.datuid,username,age2,"Jerry",1001,"Tom",25數(shù)據(jù)導(dǎo)入命令mongoimport導(dǎo)入JSON數(shù)據(jù)測(cè)試時(shí)可以先將原表刪掉,以便更好的演示,導(dǎo)入時(shí)會(huì)自動(dòng)隱式創(chuàng)建數(shù)據(jù)庫(kù)結(jié)構(gòu)。[root@localhostbin]#./mongoimport-dmy_mongodb-cuseruser.dat

connectedto:imported2objects導(dǎo)入CSV數(shù)據(jù)

參數(shù)說(shuō)明:-type 指明要導(dǎo)入的文件格式-headerline 表明不導(dǎo)入第一行,因?yàn)榈谝恍惺橇忻?file 指明要導(dǎo)入的文件路徑注意:CSV格式良好,主流數(shù)據(jù)庫(kù)都支持導(dǎo)出為CSV的格式,所以這種格式非常利于異構(gòu)數(shù)據(jù)遷移。

[root@localhostbin]#./mongoimport-dmy_mongodb-cuser--typecsv-

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論