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

下載本文檔

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

文檔簡介

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

BigtableAmazon

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

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

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

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

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

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

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

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

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

{“name":“mongo"}

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

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

1、

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

布爾類型

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

如:{“one”:true}3、

32位整數(shù)

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

64位整數(shù)

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

64位浮點數(shù)

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

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

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

符號

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

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

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

|機器

|PID|

計數(shù)器

如:ObjectId("4eae239f63520362e051e7fd")9、

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

10、正則表達式

文檔鍵值可以包含正則表達式,其正則表達式采用JS語法來表示。如:{“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平臺)第一步:下載MongoDB安裝包MongoDB的官網(wǎng):

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

echo"/usr/local/mongodb/bin/mongod--dbpath=/usr/local/mongodb/data">>/etc/rc.localMongoDB的安裝(Linux平臺)第五步:啟動mongodb運行mongod命令--dbpath執(zhí)行數(shù)據(jù)庫存放路徑(默認是/data/db)--fork是以Daemon(守護進程)方式運行,

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

注意:如果不加--fork參數(shù),則需要再開啟一個MongoDB啟動窗口。

啟動命令常用參數(shù)選項說明

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

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

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

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

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

MongoHub 主頁:/bububa/MongoHub

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

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

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

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

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

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

1)列出當前的數(shù)據(jù)庫。使用mongo命令進入數(shù)據(jù)庫,使用showdbs命令查看所有的數(shù)據(jù)庫,只有admin、local、2個數(shù)據(jù)庫。[root@localhost/]#mongoMongoDBshellversion:2.0.2connectingto:test>showdbsadmin(empty)local(empty)2)定義新的數(shù)據(jù)庫名。注意:在usemydb后,其實并沒有真正的建立起來,只是表明在使用當前的數(shù)據(jù)庫。>usemydbswitchedtodbmydb>showdbsadmin(empty)local(empty)3)保存數(shù)據(jù)。(隱式創(chuàng)建數(shù)據(jù)庫和集合)定義一個collection(集合),名為“users”,然后插入數(shù)據(jù):首先用insert語句插入一條數(shù)據(jù),使用的是users集合,插入成功后查看所有的庫,多了個mydb的庫,再查看所有集合,多了個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ù)庫基本操作:增查刪改添加數(shù)據(jù) 添加數(shù)據(jù)使用:關(guān)鍵字insert

或save 語法格式:

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

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

在這里給大家提出一個方案: 自己定義一個函數(shù),來讓它實現(xiàn)id自增。 如圖中代碼:在插入_id時調(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語法格式:db.collname.remove({條件})(不寫條件刪除所有記錄)注意:{}中也就是第一個參數(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語法格式:db.collname.update({條件})和刪除一樣,第一個參數(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ù)組末尾加入一個元素,如果沒有就創(chuàng)建一個新的數(shù)組db.user.update({name:”user1”},{$push:{hobby:”football”}})2.$addToSet修改器判斷一個值不在數(shù)組中就插入,存在的話不執(zhí)行插入db.user.update({name:”user1”},{$addToSet:{hobby:”sing”}})相當于:db.user.update({name:”user1”,hobby:{$ne:”sing”}},{$push:{hobby:”sing”}})數(shù)組修改器:3.將$addToSet和$each組合起來,可以添加多個不同的值db.user.update({“_id”:ObjectId(”…”)},{$addToSet:{email:{$each:[“haha@163.com”,”haha@”]}}})這種情況下,使用$ne和$push是無法實現(xiàn)的。4.$pop修改器可以從數(shù)組的任何一端刪除元素$pop:{key:1}從數(shù)組末尾刪除一個元素$pop:{key:-1}從數(shù)組開頭刪除一個元素5.$pull修改器$pullAll基于特定條件刪除元素$pull:{hobby:”football”}數(shù)組修改器:6.數(shù)組的定位修改器$若數(shù)組有多個值,我們可以通過下標直接作為鍵來選擇元素users:[{name:”user1”,},{name:”user2”},{name:”user3”}]db.c1.update({title:”haha”},{$set:{:”user4”}})這樣通過下標取很不方便。db.c1.update({:”user1”},{$set:{users.$.name:”user4”}})Upsert:Upsert是一種特殊的更新,要是沒有文檔符合更新條件,就創(chuàng)建一個新文檔,如果找到了匹配的文檔,則正常更新。db.user.update({name:”user1”},{name:”user2”},true)如果沒有以name:”user1”為條件的記錄,那么就以name:”user1”這個條件和更新文檔name:”user2”為基礎(chǔ)創(chuàng)建文檔,也就是說,先創(chuàng)建一個name:”user1”的文檔,然后再更新name:”user1”為name:”user2”。又例:db.math.remove();db.math.update({count:25},{$inc:{count:3}},true)先清空文檔,創(chuàng)建一個以”count”的值為25的文檔,隨后將這個值加3,最終得到count為28。Save:Save是一個shell函數(shù),相當于upsertvarx=db.user.findOne()x.num=42db.user.save(x)要是這個文檔含有”_id”鍵,save會調(diào)用upsert,否則會調(diào)用插入。等價于:db.user.update({_id:x._id},x)更新多個文檔:默認情況下,更新只能對符合匹配條件的第一個文檔執(zhí)行操作。要是有多個文檔符合條件,其余的文檔不做變化,要是所有匹配到的文檔都得到更新,可以設(shè)置update的第4個參數(shù)為true。例如:假設(shè)要給所有在特定日期過生日的用戶一份禮物,就可以使用多文檔更新,將gift增加到他們的賬號。db.user.update({birthday:”12/21/2012”},{$set:{gift:”happybirthday”}},false,true)這樣就給生日為2012年12月21日的所有用戶文檔增加了“gift”鍵。想要知道多文檔更新到底更新了多少文檔,可以運行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(查詢一條)語法格式: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日前注冊的人,可以像下面這樣:start=newDate(“12/21/2012”)db.user.find({“registered”:{“$lt”:start}})OR查詢:$in,$or$in針對同一鍵的不同值,相同的還有$nin$or針對不同鍵例如: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é)果正則表達式:正則表達式能夠靈活有效地匹配字符串。db.user.find({“name”:/jiege/i})查詢數(shù)組:$all如果需要通過多個元素來匹配數(shù)組,就要用$all了,這樣就會匹配一組元素。db.food.find({fruit:{$all:[“apple”,”banana”]}})$size:查詢指定長度的數(shù)組。db.food.find({“fruit”:{“$size”:3}})$slice操作符$slice返回數(shù)組的一個子集合。例如:假設(shè)有一個博客文章的文檔,要想返回前10條評論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條的評論$elemMatch匹配數(shù)組中的單個內(nèi)嵌文檔的限定條件。例如:現(xiàn)有博客文章若干,要找到由Joe發(fā)表的5分以上的評論。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)用就是比較文檔中的兩個鍵的值是否相等。例如:有個條目列表,如果其中的兩個值相等則返回文檔。db.foo.insert({“apple”:1,”banana”:6,”peach”:3})db.foo.insert({“apple”:8,”peach”:4,”watermelon”:4})在第二個文檔中,”peach”和”watermelon”的值相同,所以需要返回該文檔。不是非常必要時,一定要避免使用”$where”查詢,因為它在速度上要比常規(guī)查詢慢很多。db.food.find({“$where”:function(){ for(varcurrentinthis){ for(varotherinthis){ if(current!=other&&this[current]==this[other]){returntrue; } } } returnfalse;}});游標:數(shù)據(jù)庫使用游標來返回find的執(zhí)行結(jié)果,客戶端對游標的實現(xiàn)通常能夠?qū)ψ罱K結(jié)果進行有效的控制。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個結(jié)果db.c.find().limit(3)Skip:要略過前n個文檔結(jié)果,返回余下的文檔,需要使用skip函數(shù)例如:從第四個文檔開始返回db.c.find().skip(3)用skip略過少量的文檔還是不錯的,但是要是數(shù)量非常多的話,skip就會變得很慢,所以要盡量避免。Sort:Sort用一個對象作為參數(shù):一組鍵/值對,鍵對應(yīng)文檔的鍵名,值代表排序的方向,1為升序,-1為降序。如果指定了多個鍵,則按照多個鍵的順序逐個排序。例如:要按照“username”升序及“age”降序排序,可以這樣寫。db.c.find().sort({username:1,age:-1})不用skip對結(jié)果分頁:例如:要按照“date”降序顯示文檔??梢杂萌缦路绞将@取結(jié)果的第一頁:varpage1=db.foo.find().sort({“date”:-1}).limit(100)然后,可以利用最后一個文檔中“date”的值作為查詢條件,來獲取下一頁: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})對于同一個集合,同樣的索引只需要創(chuàng)建一次,反復(fù)創(chuàng)建是徒勞的。創(chuàng)建索引的缺點就是每次插入、更新和刪除時都會產(chǎn)生額外的開銷。這是因為數(shù)據(jù)庫不但需要執(zhí)行這些操作,還要將這些操作在集合的索引中標記。因此要盡可能少創(chuàng)建索引。為內(nèi)嵌文檔的鍵建立索引和為普通的鍵建立索引沒有什么區(qū)別。db.blog.ensureIndex({“comments.date”:1})索引方向:傳遞給ensureIndex的文檔形式是:一組值為1或-1的鍵,表示索引創(chuàng)建的方向。若索引只有一個鍵,則方向無關(guān)緊要。若有多個鍵,就要考慮方向問題了。例如:現(xiàn)需要對用戶名進行升序搜索,對年齡做降序搜索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)建唯一索引時刪除重復(fù)文檔:db.user.ensureIndex({“username”:1},{“unique”:true,”dropDups”:true})Explain:Explain會返回查詢使用的索引情況(如果有的話),耗時及掃描文檔數(shù)的統(tǒng)計信息。db.user.find().explain()索引管理:索引的元信息存儲在每個數(shù)據(jù)庫的system.indexes集合中。刪除索引:db.runCommand({“dropIndexes”:”user”,”index”:”name”})db.user.dropIndex({“name”:1})db.user.dropIndexes()聚合:CountCount是最簡單的聚合工具,返回集合中的文檔數(shù)量。db.user.count();db.user.insert({“x”:1})db.user.count()也可以傳遞查詢,Mongo則會計算查詢結(jié)果的數(shù)量:db.user.insert({“x”:2})db.user.count()db.user.count({“x”:1}) 增加查詢條件會使得count變慢Distinct:用來找出給定鍵的所有不同的值,使用時必須制定集合和鍵。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ù)庫命令:getLastError:來查看一個更新對多少個文檔起作用:db.count.update({x:1},{$inc:{x:1}},false,true)db.runCommand({getLastError:1})Drop:刪除一個集合,等同于drop()db.$cmd.findOne({“drop”:”test”})db.collname.drop()訪問有些命令需要有管理員權(quán)限,必須在admin數(shù)據(jù)庫里面運行,如果在別的數(shù)據(jù)庫里運行這樣的命令,會得到“拒絕訪問”的錯誤。性能優(yōu)化explain執(zhí)行計劃

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

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

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

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

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

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

files

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

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

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

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

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

是一種慢查詢?nèi)罩竟δ?,可以作為我們?yōu)化數(shù)據(jù)庫的依據(jù)。

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

中。我們可以通過db.getProfilingLevel()命令來獲取當前的Profile級別.具體操作:上面profile的級別可以取0,1,2三個值,它們的表示:0–

不開啟1–

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

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

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

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

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

一個比較簡潔的命令showProfile,可列出最近5

條執(zhí)行時間超過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功能肯定是會影響效率的,但是不太嚴重,原因是他使用的是file來記錄,file是一個cappedcollection這種collection在操作上有一些限制和特點,但是效率更高。db.posts.find({},{ts:1,title:1,author:1,abstract:1}).sort({ts:-1}).limit(10);性能監(jiān)控通過對數(shù)據(jù)庫的性能監(jiān)控,能夠更好的了解數(shù)據(jù)庫的工作狀態(tài),從而進行優(yōu)化。介紹幾個性能監(jiān)控的工具:Mongosniff此工具可從底層監(jiān)控到底有哪些命令發(fā)送給MongoDB去執(zhí)行。./mongosniff--sourceNETlo

它是實時動態(tài)監(jiān)視的,需要打開另一個客戶端進行命令操。可以將這些數(shù)據(jù)輸出到一個日志文件中,那么就可以保留下所有數(shù)據(jù)庫操作的歷史記錄,對于后期的性能分析和安全審計等工作將是一個巨大的貢獻。。Mongostat此工具可以快速的查看某組運行中的MongoDB實例的統(tǒng)計信息,也需要在打開一個客戶端進行命令操作:用法如下:[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字段說明:

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

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

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

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

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

"avgObjSize":50.57142857142857,--對象平均大小

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

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

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

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

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

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

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

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

mongoimport

數(shù)據(jù)導(dǎo)出命令mongoexport假設(shè)庫里有一張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ù)說明:-d指明使用的庫,“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ù)說明:-csv指要要導(dǎo)出為csv格式-f指明需要導(dǎo)出哪些例更詳細的用法可以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ù)測試時可以先將原表刪掉,以便更好的演示,導(dǎo)入時會自動隱式創(chuàng)建數(shù)據(jù)庫結(jié)構(gòu)。[root@localhostbin]#./mongoimport-dmy_mongodb-cuseruser.dat

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

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

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

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論