初學MongoDB實踐筆記——安裝、建立資料庫、儲存及查詢資料,初學mongodb
MongoDB是一個可擴充、高效能的分布式文檔儲存資料庫,由C 語言編寫,旨在為web應用提供可擴充的高效能資料儲存解決方案。它的特點是高效能、易部署、易使用,儲存資料非常方便。
Mongo DB 是目前在IT行業非常流行的一種非關係型資料庫(NoSql),其靈活的資料存放區方式備受當前IT從業人員的青睞。Mongo DB很好的實現了物件導向的思想(OO思想),在Mongo DB中每一條記錄都是一個Document對象。Mongo DB最大的優勢在於所有的資料持久操作都無需開發人員手動編寫SQL語句,直接調用方法就可以輕鬆的實現CRUD操作。
文檔資料庫介紹:
MongoDB資料庫中一條記錄是一個文檔,他的資料結構由(field)和值(value)成對的組成。MongoDB文檔類似於JSON對象。欄位(域)的值可以包含其他文檔、數組和文檔數組。
如所示MongoDB文檔結構:
使用文檔資料庫的優勢如下:
在許多程式設計語言中,文檔(即對象)適合原生資料類型;
嵌入式文檔和數組減少昂貴的關係型關聯需要;
動態資料結構模式支援流暢的可擴充多態性。
安裝
官方網站:http://www.mongodb.org/downloads,下載Windows 64bit地址。
MongoDB在Windows 7上的安裝運行很方便。直接下載、解壓,然後運行bin/mongod 即可啟動伺服器,運行bin/mongo 即可運行命令列用戶端。
我是使用預設安裝到C盤Program Files\MongoDB 2.6 Standard目錄下,為了方便學習,將其拷貝到C盤根目錄下,為C:\MongoDB。
注意:請最好不要安裝到C盤Program Files目錄下,而且安裝目錄不要包含空格,否則,將麻煩些,也就是命令列參數每個參數要用“”括起來,例如:
repeat "I am hungry" now
命令會把字串"I am hungry"分配給argv[1],把字串"now"分配給argv[2]。
在啟動MongoDB之前,我們必須建立一個存放mongoDB資料和日誌的目錄。資料庫目錄:C:\MongoDB\data\db\,日誌目錄:C:\MongoDB\data\。
啟動服務
開啟CMD視窗,進入到C:\MongoDB\bin目錄下,運行服務端mongod.exe。
C:\MongoDB\bin>mongod.exe --dbpath=C:\MongoDB\data\db --directoryperdb --logpath=C:\MongoDB\data\logs --logappend
註:如果服務未啟動成功,主要是兩個原因,一是未建data\db\目錄;以及防火牆不允許開放服務所需連接埠。
運行用戶端
再開啟一個CMD視窗,進入到C:\MongoDB\bin目錄下,運行用戶端mongo.exe來登入MongoDB。(要保持服務端mongod.exe的視窗不關閉)
Java開發資料庫驅動
驅動Jar包連結地址,驅動ZIP包連結地址。https://github.com/mongodb/mongo-java-driver/releases
在用戶端練習
刪除使用者:db.dropUser('username')
建立OA資料庫:use OA
註:如果不做其他動作,則OA資料庫是不會被建立的。
建立collections:OA.createCollection("mytest");
查看資料庫:
> show dbs
OA 0.078GB
admin 0.078GB
db (empty)
local 0.078GB
test (empty)
查看Collection(相當於“表”):
> show collections
建立文檔資料資料表,並插入資料記錄。
> 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 })
查詢
查詢資料數量(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 無固定結構,每張表每段資料可以有不同的結構,這既是好處也是缺點,缺點在於你必須很瞭解MongoDB的表結構,這其實給維護人員帶來一定的不適應和麻煩。
此問題也很容易解決,就是增加表結構定義表,用於說明各種情況下的結構定義,例如可配置審批單,就是比較適用。
嵌套式設計,例如審批單帶有明細項目,其中,明細項目是多行資料內容,則操作如下:
>db.doctest.save({id:5,name:'ttest5',code:'106',detail:[{item:'測試卡1',type:'Card',acount:3},{item:'測試卡2',type:'Card',acount:5}]});
查詢其中型號(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" : "測試手機", "type" : "Mobile", "acount" : 5 } ] }
查看審批單的設計:
> db.doctest.find();
查詢內嵌文檔
查詢文檔有兩種方式,一種是完全匹查詢,另一種是針對鍵值對查詢!內嵌文檔的完全符合查詢和數組的完全符合查詢一樣,內嵌文檔內鍵值對的數量,順序都必須一致才會匹配,如下例:
針對內嵌文檔特定鍵值對的查詢是最常用的!通過點標記法來精確表示內嵌文檔的鍵。
參考:Introduction to MongoDB
學習MongoDB--(4-2):MongoDB查詢(數組、內嵌文檔和$where)
mongodb的查詢語句學習摘要
百度百科MongoDB
大資料廠商聯盟 MongoDB