MongoDB是1個(gè)可擴(kuò)大、高性能的散布式文檔存儲(chǔ)數(shù)據(jù)庫,由C 語言編寫,旨在為web利用提供可擴(kuò)大的高性能數(shù)據(jù)存儲(chǔ)解決方案。它的特點(diǎn)是高性能、易部署、易使用,存儲(chǔ)數(shù)據(jù)非常方便。
Mongo DB 是目前在IT行業(yè)非常流行的1種非關(guān)系型數(shù)據(jù)庫(NoSql),其靈活的數(shù)據(jù)存儲(chǔ)方式備受當(dāng)前IT從業(yè)人員的青睞。Mongo DB很好的實(shí)現(xiàn)了面向?qū)ο蟮乃枷耄∣O思想),在Mongo DB中每條記錄都是1個(gè)Document對(duì)象。Mongo DB最大的優(yōu)勢(shì)在于所有的數(shù)據(jù)持久操作都無需開發(fā)人員手動(dòng)編寫SQL語句,直接調(diào)用方法就能夠輕松的實(shí)現(xiàn)CRUD操作。
文檔數(shù)據(jù)庫介紹:
MongoDB數(shù)據(jù)庫中1條記錄是1個(gè)文檔,他的數(shù)據(jù)結(jié)構(gòu)由(field)和值(value)成對(duì)的組成。MongoDB文檔類似于JSON對(duì)象。字段(域)的值可以包括其他文檔、數(shù)組和文檔數(shù)組。
以下圖所示MongoDB文檔結(jié)構(gòu):
使用文檔數(shù)據(jù)庫的優(yōu)勢(shì)以下:
在許多程序設(shè)計(jì)語言中,文檔(即對(duì)象)合適原生數(shù)據(jù)類型;
嵌入式文檔和數(shù)組減少昂貴的關(guān)系型關(guān)聯(lián)需要;
動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)模式支持流暢的可擴(kuò)大多態(tài)性。
官方網(wǎng)站:http://www.mongodb.org/downloads,下載Windows 64bit地址。
MongoDB在Windows 7上的安裝運(yùn)行很方便。直接下載、解壓,然后運(yùn)行bin/mongod 便可啟動(dòng)服務(wù)器,運(yùn)行bin/mongo 便可運(yùn)行命令行客戶端。
我是使用默許安裝到C盤Program FilesMongoDB 2.6 Standard目錄下,為了方便學(xué)習(xí),將其拷貝到C盤根目錄下,為C:MongoDB。
注意:請(qǐng)最好不要安裝到C盤Program Files目錄下,而且安裝目錄不要包括空格,否則,將麻煩些,也就是命令行參數(shù)每一個(gè)參數(shù)要用“”括起來,例如:
repeat "I am hungry" now
命令會(huì)把字符串"I am hungry"分配給argv[1],把字符串"now"分配給argv[2]。
在啟動(dòng)MongoDB之前,我們必須新建1個(gè)寄存mongoDB數(shù)據(jù)和日志的目錄。數(shù)據(jù)庫目錄:C:MongoDBdatadb,日志目錄:C:MongoDBdata。
打開CMD窗口,進(jìn)入到C:MongoDBin目錄下,運(yùn)行服務(wù)端mongod.exe。
C:MongoDBin>mongod.exe --dbpath=C:MongoDBdatadb --directoryperdb --logpath=C:MongoDBdatalogs --logappend
注:如果服務(wù)未啟動(dòng)成功,主要是兩個(gè)緣由,1是未建datadb目錄;和防火墻不允許開放服務(wù)所需端口。
運(yùn)行客戶端
再打開1個(gè)CMD窗口,進(jìn)入到C:MongoDBin目錄下,運(yùn)行客戶端mongo.exe來登錄MongoDB。(要保持服務(wù)端mongod.exe的窗口不關(guān)閉)
驅(qū)動(dòng)Jar包鏈接地址,驅(qū)動(dòng)ZIP包鏈接地址。https://github.com/mongodb/mongo-java-driver/releases
刪除用戶:db.dropUser('username')
創(chuàng)建OA數(shù)據(jù)庫:use OA
注:如果不做其他操作,則OA數(shù)據(jù)庫是不會(huì)被創(chuàng)建的。
創(chuàng)建collections:OA.createCollection("mytest");
查看數(shù)據(jù)庫:
> show dbs
OA 0.078GB
admin 0.078GB
db (empty)
local 0.078GB
test (empty)
查看Collection(相當(dāng)于“表”):
> show collections
創(chuàng)建文檔數(shù)據(jù)數(shù)據(jù)表,并插入數(shù)據(jù)記錄。
> use OA
switched to db OA
> db.createCollection("doctest")
{ "ok" : 1 }
> db.doctest.save({id:1,name:'ttest1'});
WriteResult({ "nInserted" : 1 })
> db.doctest.save({id:2,name:'ttest1',code:'102'});
WriteResult({ "nInserted" : 1 })
> db.doctest.save({id:3,name:'ttest3',code:'103',class:'doc'});
WriteResult({ "nInserted" : 1 })
> db.doctest.save({id:4,name:'ttest4',code:'104'});
WriteResult({ "nInserted" : 1 })
查詢
查詢數(shù)據(jù)數(shù)量(count)
> db.doctest.find().count();
4
條件(=)查詢,條件為:name="ttest1"。
> db.doctest.find({"name":"ttest1"});
{ "_id" : ObjectId("54a1003556a081db9d632745"), "id" : 1, "name" : "ttest1" }
{ "_id" : ObjectId("54a1005756a081db9d632746"), "id" : 2, "name" : "ttest1", "code" : "102" }
條件(>=)查詢,條件為:id>3。
> db.doctest.find({id:{$gt:3}});
{ "_id" : ObjectId("54a100a056a081db9d632748"), "id" : 4, "name" : "ttest4", "code" : "104" }
> db.doctest.find({id:{$gte:3}});
{ "_id" : ObjectId("54a1008c56a081db9d632747"), "id" : 3, "name" : "ttest3", "code" : "103", "class" : "doc" }
{ "_id" : ObjectId("54a100a056a081db9d632748"), "id" : 4, "name" : "ttest4", "code" : "104" }
條件(in)查詢,條件為:id in (2,3)。
> db.doctest.find({id:{$in:[2,3]}});
說明:$gt : > --(Greater than 的首字母)
$gte : >= --(Greater than or equal 的首字母)
$lt :< --(Less than 的首字母)
$lte :<= --(Less than or equal 的首字母)
$ne : != --(Not equal 的首字母)
推薦客戶端工具
1. MongoVUE ,http://blog.mongovue.com/
MongoDB 無固定結(jié)構(gòu),每張表每段數(shù)據(jù)可以有不同的結(jié)構(gòu),這既是好處也是缺點(diǎn),缺點(diǎn)在于你必須很了解MongoDB的表結(jié)構(gòu),這其實(shí)給保護(hù)人員帶來1定的不適應(yīng)和麻煩。
此問題也很容易解決,就是增加表結(jié)構(gòu)定義表,用于說明各種情況下的結(jié)構(gòu)定義,例如可配置審批單,就是比較適用。
嵌套式設(shè)計(jì),例如審批單帶有明細(xì)項(xiàng)目,其中,明細(xì)項(xiàng)目是多行數(shù)據(jù)內(nèi)容,則操作以下:
>db.doctest.save({id:5,name:'ttest5',code:'106',detail:[{item:'測(cè)試卡1',type:'Card',acount:3},{item:'測(cè)試卡2',type:'Card',acount:5}]});
查詢其中型號(hào)(Type)是“Mobile”的記錄,在操作以下:
> db.doctest.find({"detail.type":"Mobile"});
{ "_id" : ObjectId("54a39ebdd8389293ac59e78a"), "id" : 6, "name" : "ttest6", "code" : "107", "detail" : [ { "item" : "員工卡1", "type" : "Card", "acount" : 3 }, { "item" : "測(cè)試手機(jī)", "type" : "Mobile", "acount" : 5 } ] }
查看審批單的設(shè)計(jì):
> db.doctest.find();
查詢文檔有兩種方式,1種是完全匹查詢,另外一種是針對(duì)鍵值對(duì)查詢!內(nèi)嵌文檔的完全匹配查詢和數(shù)組的完全匹配查詢1樣,內(nèi)嵌文檔內(nèi)鍵值對(duì)的數(shù)量,順序都必須1致才會(huì)匹配,以下例:
針對(duì)內(nèi)嵌文檔特定鍵值對(duì)的查詢是最經(jīng)常使用的!通過點(diǎn)表示法來精確表示內(nèi)嵌文檔的鍵。
參考:Introduction to MongoDB
學(xué)習(xí)MongoDB--(4⑵):MongoDB查詢(數(shù)組、內(nèi)嵌文檔和$where)
mongodb的查詢語句學(xué)習(xí)摘要
百度百科MongoDB
大數(shù)據(jù)廠商同盟 MongoDB