MongoDB入門必讀(概念與實戰並重)

MongoDB入門必讀(概念與實戰並重)

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中就可使用。

  MongoDB入門必讀(概念與實戰並重)

  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入門必讀(概念與實戰並重)

相關文章
相關標籤/搜索