1、概述php
MongoDB是一個基於分佈式文件存儲的數據庫開源項目。由C++語言編寫。旨在爲WEB應用提供可護展的高性能數據存儲解決方案。html
MongoDB是一個介於關係數據庫和非關係數據庫之間的產品,是非關係數據庫當中功能最豐富,最像關係數據庫的。他支持的數據結構很是鬆散,是相似json的bjson格式,所以能夠存儲比較複雜的數據類型。Mongo最大的特色是他支持的查詢語言很是強大,其語法有點相似於面向對象的查詢語言,幾乎能夠實現相似關係數據庫單表查詢的絕大部分功能,並且還支持對數據創建索引。
Mongo主要解決的是海量數據的訪問效率問題,根據官方的文檔,當數據量達到50GB以上的時候,Mongo的數據庫訪問速度是MySQL的10倍以上。Mongo的併發讀寫效率不是特別出色,根據官方提供的性能測試代表,大約每秒能夠處理0.5萬-1.5次讀寫請求。
由於Mongo主要是支持海量數據存儲的,因此Mongo還自帶了一個出色的分佈式文件系統GridFS,能夠支持海量的數據存儲,但我也看到有些評論認爲GridFS性能不佳,有待驗證。
最後因爲Mongo能夠支持複雜的數據結構, 並且帶有強大的數據查詢功能,所以很是受到歡迎,不少項目都考慮用MongoDB來替代MySQL來實現不是特別複雜的Web應用,比方說why we migrated from MySQL to MongoDB就是一個真實的從MySQL遷移到MongoDB的案例,因爲數據量實在太大,因此遷移到了Mongo上面,數據查詢的速度獲得了很是顯著 的提高。
MongoDB也有一個ruby的項目MongoMapper,是模仿Merb的DataMapper編寫的MongoDB的接口,使用起來很是簡單,幾乎和DataMapper如出一轍,功能很是強大易用。
java
總結起來,monggDB的特色是高性能、易部署、易使用,存儲數據很是方便。主要功能特性有:mysql
*面向集合存儲,易存儲對象類型的數據。
*模式自由。
*支持動態查詢。
*支持徹底索引,包含內部對象。
*支持查詢。
*支持複製和故障恢復。
*使用高效的二進制數據存儲,包括大型對象(如視頻等)。
*自動處理碎片,以支持雲計算層次的擴展性
*支持RUBY,PYTHON,JAVA,C++,PHP等多種語言。
*文件存儲格式爲BSON(一種JSON的擴展)
*可經過網絡訪問linux
所謂「面向集合」(Collenction-Orented),意思是數據被分組存儲在數據集中,被稱爲一個集合(Collenction)。 每一個集合在數據庫中都有一個惟一的標識名,而且能夠包含無限數目的文檔。集合的概念相似關係型數據庫(RDBMS)裏的表(table),不一樣的是它不需 要定義任何模式(schema)。
模式自由(schema-free),意味着對於存儲在mongodb數據庫中的文件,咱們不須要知道它的任何結構定義。若是須要的話,你徹底能夠把不一樣結構的文件存儲在同一個數據庫裏。
存儲在集合中的文檔,被存儲爲鍵-值對的形式。鍵用於惟一標識一個文檔,爲字符串類型,而值則能夠是各中複雜的文件類型。咱們稱這種存儲形式爲BSON(Binary Serialized dOcument Format)。正則表達式
推薦閱讀:sql
Ubuntu 13.04下安裝MongoDB2.4.3 mongodb
如何在MongoDB中創建新數據庫和集合 shell
MongoDB的優勢
高性能,速度很是快(若是你的內存足夠的話)
沒有固定的表結構,不用爲了修改表結構而進行數據遷移
查詢語言簡單,容易上手
使用Sharding實現水平擴展
部署方便 使用MongoDB,你得記住如下幾點:
MongoDB 假設你有大磁盤空間
MongoDB 假設你的內存也足夠大於放下你的熱數據
MongoDB 假設你是部署在64位系統上的(32位有2G的限制,試用還能夠)
MongoDB 假設你的系統是little-endian的
MongoDB 假設你有多臺機器(並不專一於單機可靠性)
MongoDB 假設你但願用安全換性能,同時容許你用性能換安全 MongoDB在下面領域不太擅長
不太穩定,特別是auto-sharding目前還有不少問題
不支持SQL,這意味着你不少經過SQL接口的工具再也不適用
持久化,MongoDB單機可靠性不太好,宕機可能丟失一段時間的數據
相關文檔比較少,新功能都有這個問題
相關人才比較難找,這也是新功能的問題之一數據庫
2、安裝
MongoDB服務端可運行在Linux、Windows或OS X平臺,支持32位和64位應用,默認端口爲27017。推薦運行在64位平臺,由於MongoDB
在32位模式運行時支持的最大文件尺寸爲2GB。MongoDB把數據存儲在文件中(默認路徑爲:/data/db),爲提升效率使用內存映射文件進行管理。
(一)Linux/OS X下:
1 創建數據目錄
mkdir -p /data/db
2 下載壓縮包
curl -O
3 解壓縮文件
tar xzf mongodb-linux-i386-latest.tgz
4 啓動服務
bin/mongod run &
5 使用自帶客戶端鏈接
/bin/mongo
6 測試
db.foo.save( { a : 1 } )
db.foo.findOne()
(二)windows下:
1 創建數據目錄c:\data\db
2 下載壓縮包,解壓文件
3 啓動服務
bin\mongod.exe run
4 自帶客戶端
bin\mongon.exe
在LINUX和WINDOWS系統下的使用大同小異,不一樣的地方主要是默認的數據存儲目錄。LINUX類系統下存放在/data/db下,而WINDOWS
會存放在C:\data\db下。能夠在啓動時使用--dbpath參數指定存儲目錄並啓動。如:bin\mongod.exe --dbpath d:\data\mongo
經常使用啓動參數:
run 直接啓動。例:./mongod run
--dbpath 指定特定存儲目錄啓動,若目錄不存在則建立。例:./mongod --dbpath /var/data/mongo
--port 指定端口啓動。例:./mongod --port 12345
中止MONGO服務:
方法1:服務端中止,可以使用Ctrl+C
方法2:在客戶端中止,可先鏈接客戶端
./mongo
並使用命令
db.shutdownerver()
而後退出客戶端
exit
3、mongoDB經常使用命令
一、與Mql對照
MySQL |
MongoDB |
說明 |
mysqld |
mongod |
服務器守護進程 |
mysql |
mongo |
客戶端工具 |
mysqldump |
mongodump |
邏輯備份工具 |
mysql |
mongorestore |
邏輯恢復工具 |
db.repairDatabase() |
修復數據庫 |
|
mysqldump |
mongoexport |
數據導出工具 |
source |
mongoimport |
數據導入工具 |
grant * privileges on *.* to … |
Db.addUser() Db.auth() |
新建用戶並權限 |
show databases |
show dbs |
顯示庫列表 |
Show tables |
Show collections |
顯示錶列表 |
Show slave status |
Rs.status |
查詢主從狀態 |
Create table users(a int, b int) |
db.createCollection("mycoll", {capped:true, size:100000}) 另:可隱式建立表。 |
建立表 |
Create INDEX idxname ON users(name) |
db.users.ensureIndex({name:1}) |
建立索引 |
Create INDEX idxname ON users(name,ts DESC) |
db.users.ensureIndex({name:1,ts:-1}) |
建立索引 |
Insert into users values(1, 1) |
db.users.insert({a:1, b:1}) |
插入記錄 |
Select a, b from users |
db.users.find({},{a:1, b:1}) |
查詢表 |
Select * from users |
db.users.find() |
查詢表 |
Select * from users where age=33 |
db.users.find({age:33}) |
條件查詢 |
Select a, b from users where age=33 |
db.users.find({age:33},{a:1, b:1}) |
條件查詢 |
select * from users where age<33 |
db.users.find({'age':{$lt:33}}) |
條件查詢 |
select * from users where age>33 and age<=40 |
db.users.find({'age':{$gt:33,$lte:40}}) |
條件查詢 |
select * from users where a=1 and b='q' |
db.users.find({a:1,b:'q'}) |
條件查詢 |
select * from users where a=1 or b=2 |
db.users.find( { $or : [ { a : 1 } , { b : 2 } ] } ) |
條件查詢 |
select * from users limit 1 |
db.users.findOne() |
條件查詢 |
select * from users where name like "%Joe%" |
db.users.find({name:/Joe/}) |
模糊查詢 |
select * from users where name like "Joe%" |
db.users.find({name:/^Joe/}) |
模糊查詢 |
select count(1) from users |
Dunt() |
獲取表記錄數 |
select count(1) from users where age>30 |
db.users.find({age: {'$gt': 30}}unt() |
獲取表記錄數 |
select DISTINCT last_name from users |
db.users.distinct('last_name') |
去掉重複值 |
select * from users ORDER BY name |
db.users.find().sort({name:-1}) |
排序 |
select * from users ORDER BY name DESC |
db.users.find().sort({name:-1}) |
排序 |
EXPLAIN select * from users where z=3 |
db.users.find({z:3}).explain() |
獲取存儲路徑 |
update users set a=1 where b='q' |
db.users.update({b:'q'}, {$set:{a:1}}, false, true) |
更新記錄 |
update users set a=a+2 where b='q' |
db.users.update({b:'q'}, {$inc:{a:2}}, false, true) |
更新記錄 |
delete from users where z="abc" |
db.users.remove({z:'abc'}) |
刪除記錄 |
db. users.remove() |
刪除全部的記錄 |
|
drop database IF EXISTS test; |
use test db.dropDatabase() |
刪除數據庫 |
drop table IF EXISTS test; |
db.mytable.drop() |
刪除表/collection |
db.addUser(‘test’, ’test’) |
添加用戶 readOnly-->false |
|
db.addUser(‘test’, ’test’, true) |
添加用戶 readOnly-->true |
|
db.addUser("test","test222") |
更改密碼 |
|
db.system.users.remove({user:"test"}) 或者db.removeUser('test') |
刪除用戶 |
use admin |
超級用戶 |
db.auth(‘test’, ‘test’) |
用戶受權 |
db.system.users.find() |
查看用戶列表 |
show users |
查看全部用戶 |
db.printCollectionStats() |
查看各collection的狀態 |
db.printReplicationInfo() |
查看主從複製狀態 |
show profile |
查看profiling |
pyDatabase('mail_addr','mail_addr_tmp') |
拷貝數據庫 |
db.users.dataSize() |
查看collection數據的大小 |
db. users.totalIndexSize() |
查詢索引的大小 |
二、shell數據操做實戰
插入數據到集合
下面咱們來創建一個test的集合並寫入一些數據. 創建兩個對象, j 和 t , 並保存到集合中去.
在例子裏 ‘>’ 來表示是 shell 輸入提示符
> j = { name : "mongo" };{"name" : "mongo"}> t = { x : 3 };{ "x" : 3 }> db.things.save(j);> db.things.save(t);> db.things.find();{"name" : "mongo" , "_id" : ObjectId("497cf60751712cf7758fbdbb")}{"x" : 3 , "_id" : ObjectId("497cf61651712cf7758fbdbc")}>
有幾點須要注意下 :
不須要預先創建一個集合. 在第一次插入數據時候會自動創建.
在例子其實能夠存儲任何結構的數據, 固然在實際應用咱們存儲的仍是相同元素的集合. 這個特性其實能夠在應用裏很靈活, 你不須要相似alter table 來修改你的數據結構
每次插入數據時候對象都會有一個ID, 名字叫 _id.
當你運行不一樣的例子, 你的對象ID值都是不一樣的.
下面再加點數據:
> for( var i = 1; i < 10; i++ ) db.things.save( { x:4, j:i } ); > db.things.find();{"name" : "mongo" , "_id" : ObjectId("497cf60751712cf7758fbdbb")}{"x" : 3 , "_id" : ObjectId("497cf61651712cf7758fbdbc")}{"x" : 4 , "j" : 1 , "_id" : ObjectId("497cf87151712cf7758fbdbd")}{"x" : 4 , "j" : 2 , "_id" : ObjectId("497cf87151712cf7758fbdbe")}{"x" : 4 , "j" : 3 , "_id" : ObjectId("497cf87151712cf7758fbdbf")}{"x" : 4 , "j" : 4 , "_id" : ObjectId("497cf87151712cf7758fbdc0")}{"x" : 4 , "j" : 5 , "_id" : ObjectId("497cf87151712cf7758fbdc1")}{"x" : 4 , "j" : 6 , "_id" : ObjectId("497cf87151712cf7758fbdc2")}{"x" : 4 , "j" : 7 , "_id" : ObjectId("497cf87151712cf7758fbdc3")}{"x" : 4 , "j" : 8 , "_id" : ObjectId("497cf87151712cf7758fbdc4")}
請注意下, 這裏循環次數是10, 可是隻顯示到8, 還有2條數據沒有顯示.
若是想繼續查詢下面的數據只須要使用 it 命令, 就會繼續下面的數據:
{"x" : 4 , "j" : 7 , "_id" : ObjectId("497cf87151712cf7758fbdc3")}{"x" : 4 , "j" : 8 , "_id" : ObjectId("497cf87151712cf7758fbdc4")}
繼續
> it{"x" : 4 , "j" : 9 , "_id" : ObjectId("497cf87151712cf7758fbdc5")}{"x" : 4 , "j" : 10 , "_id" : ObjectId("497cf87151712cf7758fbdc6")}
從技術上講 find() 返回一個遊標對象. 但在上面的例子裏, 並無拿到一個遊標的變量. 因此 shell 自動遍歷遊標, 返回一個初始化的set, 並容許咱們繼續用 it 迭代輸出.
固然咱們也能夠直接用遊標來輸出, 不過這個是下一部分的內容了.
查詢數據
在沒有深刻查詢以前, 咱們先看看怎麼從一個查詢中返回一個遊標對象. 能夠簡單的經過 find() 來查詢, 他返回一個任意結構的集合. 若是實現特定的查詢稍後講解.
實現上面一樣的查詢, 而後經過 while 來輸出:
> var cursor = db.things.find();> while (cursor.hasNext()) { print(tojson(cursor.next())); }{"name" : "mongo" , "_id" : ObjectId("497cf60751712cf7758fbdbb")}{"x" : 3 , "_id" : ObjectId("497cf61651712cf7758fbdbc")}{"x" : 4 , "j" : 1 , "_id" : ObjectId("497cf87151712cf7758fbdbd")}{"x" : 4 , "j" : 2 , "_id" : ObjectId("497cf87151712cf7758fbdbe")}{"x" : 4 , "j" : 3 , "_id" : ObjectId("497cf87151712cf7758fbdbf")}{"x" : 4 , "j" : 4 , "_id" : ObjectId("497cf87151712cf7758fbdc0")}{"x" : 4 , "j" : 5 , "_id" : ObjectId("497cf87151712cf7758fbdc1")}{"x" : 4 , "j" : 6 , "_id" : ObjectId("497cf87151712cf7758fbdc2")}{"x" : 4 , "j" : 7 , "_id" : ObjectId("497cf87151712cf7758fbdc3")}{"x" : 4 , "j" : 8 , "_id" : ObjectId("497cf87151712cf7758fbdc4")}{"x" : 4 , "j" : 9 , "_id" : ObjectId("497cf87151712cf7758fbdc5")}>
上面的例子顯示了遊標風格的迭代輸出. hasNext() 函數告訴咱們是否還有數據, 若是有則能夠調用 next() 函數. 這裏咱們也用了自帶的 tojson() 方法返回一個標準的 JSON 格式數據.
當咱們使用的是 JavaScript shell, 能夠用到JS的特性, forEach 就能夠輸出遊標了. 下面的例子就是使用 forEach() 來循環輸出:
forEach() 必須定義一個函數供每一個遊標元素調用.
> db.things.find().forEach( function(x) { print(tojson(x));});{"name" : "mongo" , "_id" : ObjectId("497cf60751712cf7758fbdbb")}{"x" : 3 , "_id" : ObjectId("497cf61651712cf7758fbdbc")}{"x" : 4 , "j" : 1 , "_id" : ObjectId("497cf87151712cf7758fbdbd")}{"x" : 4 , "j" : 2 , "_id" : ObjectId("497cf87151712cf7758fbdbe")}{"x" : 4 , "j" : 3 , "_id" : ObjectId("497cf87151712cf7758fbdbf")}{"x" : 4 , "j" : 4 , "_id" : ObjectId("497cf87151712cf7758fbdc0")}{"x" : 4 , "j" : 5 , "_id" : ObjectId("497cf87151712cf7758fbdc1")}{"x" : 4 , "j" : 6 , "_id" : ObjectId("497cf87151712cf7758fbdc2")}{"x" : 4 , "j" : 7 , "_id" : ObjectId("497cf87151712cf7758fbdc3")}{"x" : 4 , "j" : 8 , "_id" : ObjectId("497cf87151712cf7758fbdc4")}{"x" : 4 , "j" : 9 , "_id" : ObjectId("497cf87151712cf7758fbdc5")}>
在 mongo shell 裏, 咱們也能夠把遊標看成數組來用 :
> var cursor = db.things.find();> print (tojson(cursor[4]));{"x" : 4 , "j" : 3 , "_id" : ObjectId("497cf87151712cf7758fbdbf")}
使用遊標時候請注意佔用內存的問題, 特別是很大的遊標對象, 有可能會內存溢出. 因此應該用迭代的方式來輸出.
下面的示例則是把遊標轉換成真實的數組類型:
> var arr = db.things.find().toArray();> arr[5];{"x" : 4 , "j" : 4 , "_id" : ObjectId("497cf87151712cf7758fbdc0")}
請注意這些特性只是在 mongo shell 裏使用, 而不是全部的其餘應用程序驅動都支持.
MongoDB 遊標對象不是沒有快照 – 若是有其餘用戶在集合裏第一次或者最後一次調用 next(), 你能夠得不到遊標裏的數據. 因此要明確的鎖定你要查詢的遊標.
指定條件的查詢
到這裏咱們已經知道怎麼從遊標裏實現一個查詢並返回數據對象, 下面就來看看怎麼根據指定的條件來查詢.
下面的示例就是說明如何執行一個相似SQL的查詢, 並演示了怎麼在 MongoDB 裏實現. 這是在 MongoDB shell 裏查詢, 固然你也能夠用其餘的應用驅動或者語言來實現:
SELECT * FROM things WHERE name="mongo"
>db.things.find({name:"mongo"}).forEach(function(x) { print(tojson(x));});{"name" : "mongo" , "_id" : ObjectId("497cf60751712cf7758fbdbb")}>SELECT * FROM things WHERE x=4> db.things.find({x:4}).forEach(function(x) { print(tojson(x));});{"x" : 4 , "j" : 1 , "_id" : ObjectId("497cf87151712cf7758fbdbd")}{"x" : 4 , "j" : 2 , "_id" : ObjectId("497cf87151712cf7758fbdbe")}{"x" : 4 , "j" : 3 , "_id" : ObjectId("497cf87151712cf7758fbdbf")}{"x" : 4 , "j" : 4 , "_id" : ObjectId("497cf87151712cf7758fbdc0")}{"x" : 4 , "j" : 5 , "_id" : ObjectId("497cf87151712cf7758fbdc1")}{"x" : 4 , "j" : 6 , "_id" : ObjectId("497cf87151712cf7758fbdc2")}{"x" : 4 , "j" : 7 , "_id" : ObjectId("497cf87151712cf7758fbdc3")}{"x" : 4 , "j" : 8 , "_id" : ObjectId("497cf87151712cf7758fbdc4")}{"x" : 4 , "j" : 9 , "_id" : ObjectId("497cf87151712cf7758fbdc5")}>
查詢條件是 { a:A, b:B, … } 相似 「where a==A and b==B and …」, 更多的查詢方式能夠參考 Mongo 開發教程部分.
上面顯示的是全部的元素, 固然咱們也能夠返回特定的元素, 相似於返回表裏某字段的值, 只須要在 find({x:4}) 裏指定元素的名字, 好比 j:
SELECT j FROM things WHERE x=4> db.things.find({x:4}, {j:true}).forEach(function(x) { print(tojson(x));});{"j" : 1 , "_id" : ObjectId("497cf87151712cf7758fbdbd")}{"j" : 2 , "_id" : ObjectId("497cf87151712cf7758fbdbe")}{"j" : 3 , "_id" : ObjectId("497cf87151712cf7758fbdbf")}{"j" : 4 , "_id" : ObjectId("497cf87151712cf7758fbdc0")}{"j" : 5 , "_id" : ObjectId("497cf87151712cf7758fbdc1")}{"j" : 6 , "_id" : ObjectId("497cf87151712cf7758fbdc2")}{"j" : 7 , "_id" : ObjectId("497cf87151712cf7758fbdc3")}{"j" : 8 , "_id" : ObjectId("497cf87151712cf7758fbdc4")}{"j" : 9 , "_id" : ObjectId("497cf87151712cf7758fbdc5")}>
請注意 「_id」 元素會一直被返回.
findOne()
爲了方便, mongo shell (其餘驅動) 避免遊標的可能帶來的開銷, 提供一個findOne() 函數. 這個函數和 find() 參數同樣, 不過他返回遊標裏第一條數據, 或者返回 null 空數據庫.
做爲一個例子, name==’mongo’ 能夠用不少方法來實現, 能夠用 next() 來循環遊標(須要校驗是否爲null), 或者當作數組返回第一個元素.
可是用 findOne() 方法則更簡單和高效:
> var mongo = db.things.findOne({name:"mongo"});> print(tojson(mongo));{"name" : "mongo" , "_id" : ObjectId("497cf60751712cf7758fbdbb")}>
findOne 方法更跟 find({name:」mongo」}).limit(1) 同樣.
limit() 查詢
你能夠須要限制結果集的長度, 能夠調用 limit 方法.
這是強烈推薦高性能的緣由, 經過限制條數來減小網絡傳輸, 例如:
> db.things.find().limit(3);in cursor for : DBQuery: example.things ->{"name" : "mongo" , "_id" : ObjectId("497cf60751712cf7758fbdbb")}{"x" : 3 , "_id" : ObjectId("497cf61651712cf7758fbdbc")}{"x" : 4 , "j" : 1 , "_id" : ObjectId("497cf87151712cf7758fbdbd")}>
更多幫助
除非了通常的 help 以外, 你還能夠查詢 help 數據庫和db.whatever 來查詢具體的說明.
這篇寫得經常使用命令也不錯
4、與java結合
使用JAVA語言操做MONGODB很是簡單,只要將驅動文件加入到CLASSPATH中就可使用。
junit-4.11和hamcrest-core-1.3是junit4依賴包
mongo-java-driver-2.9.3爲mongodb的java驅動包
實戰:
import com.mongodb.Mongo;
import com.mongodb.DBCollection;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import com.mongodb.DBCursor;
import com.mongodb.MongoAdmin;
一、得到鏈接
Mongo db = new Mongo("mydb");
Mongo db = new Mongo("localhost", "mydb");
Mongo db = new Mongo("localhost", 27017, "mydb");
查看mongoDB數據庫列表
Mongo m = new Mongo();
for (String s : m.getDatabaseNames()) {
System.out.println(s);
}
刪除一個數據庫
Mongo m = new Mongo();
m.dropDatabase("myDatabaseName");
2 安全驗證(非必選)
MongoDB服務能夠在安全模式運行,此時任何客戶端要鏈接數據庫時需使用用戶名和密碼。在JAVA中可以使用以下方法鏈接:
boolean auth = db.authenticate(userName, password);
若是用戶名密碼驗證經過,返回值爲true,不然爲false
3 獲取集合列表
每一個數據庫都存在零個或多個集合,須要時你能夠得到他們的列表:
Set<String> colls = db.getCollectionNames();
for(String s : colls){
System.out.println(s);
}
4 得到一個集合
要得到某個特定集合,你能夠指定集合的名字,並使用getCollection()方法:
DBCollection coll = db.getCollection("testCollection");
當你獲取了這個集合對象,你就能夠對數據進行增刪查改之類的操做。
查看一個集合的索引
List<DBObject> list = coll.getIndexInfo();
for (DBObject o : list) {
System.out.println(o);
}
5 插入文檔
默認ID
當保存的對象沒有設置ID時,mongoDB會默認給該條記錄設置一個ID("_id")。
固然你也能夠設置本身指定的ID,如:(在mongoDB中執行用db.users.save({_id:1,name:'bruce'});)
當你得到了一個集合對象,你就能夠把文檔插入到這個對象中。例如,存在一個JSON式的小文檔:
{
"name" : "MongoDB",
"type" : "database",
"count" : 1,
"info" : {
x : 203,
y : 102
}
}
請注意,這個文檔包含一個內部文檔。咱們可使用BasicDBObject類來建立這個文檔,而且使用insert()方法方便地將它插入到集
閤中。
BasicDBObject doc = new BasicDBObject();
doc.put("name", "MongoDB");
doc.put("type", "database");
doc.put("count", 1);
BasicDBObject info = new BasicDBObject();
info.put("x", 203);
info.put("y", 102);
doc.put("info", info);
coll.insert(doc);
批量插入
List datas = new ArrayList();
for (int i=0; i < 100; i++) {
BasicDBObject bo = new BasicDBObject();
bo.put("name", "bruce");
bo.append("age", i);
datas.add(bo);
}
coll.insert(datas);
6 使用findOne()查找集合中第一個文檔
要查找咱們上一步插入的那個文檔,能夠簡單地使用findOne()操做來獲取集合中第一個文檔。這個方法返回一個單一文檔(這是相對於使用DBCursor的find()操做的返回),這對於只有一個文檔或咱們剛插入第一個文檔時頗有用,由於此時並不須要使用光標。
DBObject myDoc = coll.findOne();
System.out.println(myDoc);
返回相似:
{
"_id" : "ac907a1f5b9d5e4a233ed300" ,
"name" : "MongoDB" ,
"type" : 1 ,
"info" : {
"x" : 203 ,
"y" : 102} ,
"_ns" : "testCollection"
}
注意_id和_ns元素是由MongoDB自動加入你的文檔。記住:MongoDB內部存儲使用的元素名是以「_」作爲開始。
7 加入多種文檔
爲了作更多有趣的查詢試驗,讓咱們向集合中加入多種文檔類型,象:
{
"i" : value
}
能夠經過循環來實現
for(int i = 0; i < 100; i++){
coll.insert(new BasicDBObject().append("i", i));
}
注意咱們能夠在一個集合中插入不一樣類型的文檔,這就是咱們所說的「模式自由」(schema-free)。
8 統計文檔數量
使用getCount()方法
System.out.println(coll.getCount());
9 使用光標(cursor)來獲取所有文檔
爲了獲取集合中的全部文檔,咱們可使用find()方法。這個方法返回一上DBCursor對象,來容許咱們將符合查詢條件的文檔迭代
出來。
DBCursor cur = coll.find();
while(cur.hasNext()){
System.out.println(cur.next());
}
10 在查詢中獲取單一文檔
咱們能夠建立一個查詢,並傳遞給find()方法來獲取集合中全部文檔的一個子集。例如,咱們想要查詢域名爲"i",而且值爲71的文檔:
BasicDBObject query = new BasicDBObject();
query.put("i", 71);
cur = coll.find(query);
while(cur.hasNext()){
System.out.println(cur.next());
}
類轉換
當把一個類對象存到mongoDB後,從mongoDB取出來時使用setObjectClass()將其轉換回原來的類。
public class Tweet implements DBObject {
/* ... */
}
Tweet myTweet = new Tweet();
myTweet.put("user", "bruce");
myTweet.put("message", "fun");
myTweet.put("date", new Date());
collection.insert(myTweet);
//轉換
collection.setObjectClass(Tweet);
Tweet myTweet = (Tweet)collection.findOne();
11 使用條件查詢獲取集合
比較符
"$gt": 大於
"$gte":大於等於
"$lt": 小於
"$lte":小於等於
"$in": 包含
例如,咱們想要查詢全部i>50的文檔:
BasicDBObject query = new BasicDBObject();
query.put("i", new BasicDBObject("$gt", 50));
cur = coll.find(query);
while(cur.hasNext()){
System.out.println(cur.next());
}
固然,咱們也能夠作20 < i <= 30的查詢
BasicDBObject query = new BasicDBObject();
query.put("i", new BasicDBObject("$gt", 20).append("$lte", 30));
cur = coll.find(query);
while(cur.hasNext()){
System.out.println(cur.next());
}
正則表達式
查詢全部名字匹配 /joh?n/i 的記錄
Pattern pattern = pile("joh?n", CASE_INSENSITIVE);
BasicDBObject query = new BasicDBObject("name", pattern);
DBCursor cursor = coll.find(query);
12 建立索引
MongoDB支持索引,並且很容易在集合上增長索引。要建立索引,只須要指定要加索引的屬性,而且指定升序(1)或降序便可(-1)。
coll.createIndex(new BasicDBObject("i", 1));
13 獲取索引列表
List<DBObject> list = coll.getIndexInfo();
for(DBObject o : list){
System.out.println(o);
}
14 MongoDB管理函數
管理函數在com.mongodb.MongoAdmin類中定義。
例A:獲取數據庫列表
MongoAdmin admin = new MongoAdmin();
for(String s : admin.getDatabaseNames()){
System.out.println(s);
}
例B:獲取數據庫對象
Mongo m = admin.getDB("mydb");
例C:刪除數據庫
admin.dropDatabase("mydb");
15 用DBObject存儲JAVA對象
MongoDB for JAVA驅動中提供了用於向數據庫中存儲普通對象的接口DBObject
例如,存在一個須要存儲的對象類Tweet
public class Tweet implements DBObject{
/*...*/
}
可使用以下代碼:
Tweet myTweet = new Tweet();
myTweet.put("user", userId);
myTweet.put("message", message);
myTweet.put("date", new Date());
collection.insert(myTweet);
當一個文檔從MongoDB中取出時,它會自動把文檔轉換成DBObject接口類型,要將它實例化爲你的對象,需使用
DBCollection.setObjectClass()。
collection.setObjectClass(Tweet);
Tweet myTweet = (Tweet)collection.findOne();
16 JAVA驅動的併發性
JAVA的MongoDB驅動是線程安全的。若是你將它用在WEB服務中,能夠建立它的一個單例,並在全部請求中使用它。
然而,若是你須要在一個會話(例如HTTP請求)中保證事務一致性,也許你會但願在這個會話中對驅動使用同一個端口。這僅僅在
請求量很是大的環境中,例如你常常會讀取剛寫入的數據。
爲了這一點,你須要使用以下代碼:
Mongo m;
m.restartStart();
// code.........
m.requestDone();
源碼下載地址
免費下載地址在
用戶名與密碼都是
具體下載目錄在 /2013年資料/7月/9日/MongoDB入門必讀(概念與實戰並重)