天天看點

MongoDB(二)

一、安裝MongoDB

1、安裝MongoDB

rpm包下載下傳位址:http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/RPMS/

2、檢視rpm包生成的幾個重要檔案

3、初始化資料庫

說明:實際使用中将存放資料的目錄放在有備援的邏輯卷上。

4、啟動資料庫

5、MongoDB的web接口

MongoDB(二)

二、使用MongoDB

1、MongoDB與MySQL文法對比

   傳統的關系資料庫一般由資料庫(database)、表(table)、記錄(record)三個層次概念組成,MongoDB是由資料庫(database)、集合(collection)、文檔對象(document)三個層次組成。MongoDB對于關系型資料庫裡的表,但是集合中沒有列、行和關系概念,這展現了模式自由的特點。

MongoDB(二)
MongoDB(二)
MongoDB(二)
MongoDB(二)

2、mongodb文法

查詢colls所有資料

通過指定條件查詢

指定多條件查詢

指定條件範圍查詢

查詢不包括某内容

支援<, <=, >, >=查詢,需用符号替代分别為$lt,$lte,$gt,$gte

也可對某一字段做範圍查詢

不等于查詢用字元$ne

in查詢用字元$in

not in查詢用字元$nin

取模查詢用字元$mod

$all查詢

$size查詢

$exists查詢

$type查詢$type值為bsonhttp://bsonspec.org/數 據的類型值

使用正規表達式比對

内嵌對象查詢

1.3.3版本及更高版本包含$not查詢

sort()排序

limit()對限制查詢資料傳回個數

skip()跳過某些資料

snapshot()快照保證沒有重複資料傳回或對象丢失

count()統計查詢對象個數

group()對查詢結果分組和SQL中group by函數類似

distinct()傳回不重複值

3、查詢語句說明:

類似于SQL中select語句,其中<query>相當于where子句,而<projection>相當于要標明的字段。

如果使用的find()方法中不包含<query>,則意味着要傳回對應collection的所有文檔。

“db.collection.count()”方法可以統計指定collection中文檔的個數。

比較運算:

$gt:挑選指定字段值大于指定值的文檔,文法格式“{field: {$gt: value}}”;

$gte:挑選指定字段值大于等于指定值的文檔,文法格式“{field: $gte: value}”;

$in:挑選指定字段的值位于指定數組中的文檔,文法格式“{filed: {$in: [<value1>,<value2>,...<valueN>]}}”;

$lt:挑選指定字段值小于指定值的文檔,文法格式“{field: {$lt: value}}”;

$lte:挑選指定字段值小于等于指定值的文檔,文法格式“{field: {$lte: value}}”;

$ne:挑選指定字段值不等于指定值的文檔,文法格式“{filed: {$ne: value}}”;

$nin:挑選指定字段的值沒有位于指定數組中或不存在的文檔,文法格式“{filed: {$nin: [<value1>,<value2>...valueN]}}”;

邏輯運算:

邏輯運算一般用于連接配接多個選擇條件,MongoDB支援的邏輯運算“Query Selector”有以下幾種:

$or:或運算,語句格式“{$or: [{<expression1>},{<expression2>},... ,{<expressionN>}]}”

$and:與運算,文法格式“{$and: [{<expression1>},{<expression2>},... ,{<expressionN>}]}”

$and:非運算,文法格式“{field: {$not: {<operator expression>}}}”

$nor:反運算,即傳回不符合所有指定條件的文檔,文法格式“$nor: [{<expression1>},{<expression2>},.... ,{<expressionN>}]}”

元素查詢:

如果要根據文檔中是否存在某字段等條件來挑選文檔,則需要用到元素運算。

$exixts:根據指定字段的存在性挑選文檔,文法格式“{ field: {$exists: <boolean>}}”,指定<boolean>的值為“true”則傳回存在指定字段的文檔,“false”則傳回不存在指定字段的文檔。

$mod:将指定字段的值進行取模運算,并傳回其餘數為指定值的文檔,文法格式“{field: {$mod: [divisor, remainder]}}”。

$type:傳回指定字段的值類型為指定類型的文檔,文法格式“{field: {$type: <BSON type>}}”。

3、實際練習

連入資料庫

資料的插入

檢視狀态:

就插入了兩條資料而占用了100多M的空間,說明很占用存儲空間。

MongoDB(二)

mongodb占用空間過大的原因,在官方的FAQ中,提到有如下幾個方面:

空間的預配置設定:為避免形成過多的硬碟碎片,mongodb每次空間不足時都會申請生成一大塊的硬碟空間,而且申請的量從64M、128M、 256M那樣的指數遞增,直到2G為單個檔案的最大體積。随着資料量的增加,你可以在其資料目錄裡看到這些整塊生成容量不斷遞增的檔案。 

字段名所占用的空間:為了保持每個記錄内的結構資訊用于查詢,mongodb需要把每個字段的key-value都以BSON的形式存儲,如果 value域相對于key域并不大,比如存放數值型的資料,則資料的overhead是最大的。一種減少空間占用的方法是把字段名盡量取短一些,這樣占用 空間就小了,但這就要求在易讀性與空間占用上作為權衡了。我曾建議作者把字段名作個index,每個字段名用一個位元組表示,這樣就不用擔心字段名取多長 了。但作者的擔憂也不無道理,這種索引方式需要每次查詢得到結果後把索引值跟原值作一個替換,再發送到用戶端,這個替換也是挺耗費時間的。現在的實作算是 拿空間來換取時間吧。 

删除記錄不釋放空間:這很容易了解,為避免記錄删除後的資料的大規模挪動,原記錄空間不删除,隻标記“已删除”即可,以後還可以重複利用。 

可以定期運作db.repairDatabase()來整理記錄,但這個過程會比較緩慢。 

删除collections:

添加練習例子:

檢視前兩行文檔:

删除年齡為5的文檔:

删除使用者為User:3的文檔:

将User:4使用者的年齡改為22:

檢視test庫的文檔數,及年齡大于97的文檔:

查詢年齡大于97的文檔并隻顯示Name和Age:

查詢Age大于60并小于66的文檔:

查詢包含Adress字段的文檔:

将Age大于98文檔中的Gender改為M:

将Name為User:99的文檔中PreferBooks項給删除: