NoSQL 紅一陣子了,比較有名的不外乎是 Redis 或者是 MongoDB,Redis 一般來說比較會運用在快取上(類似 memcached),MongoDB 比較會使用在 persistence database solution,來示範一下這兩天試用 Mongo 的心得。
安裝
http://www.mongodb.org/downloads
MongoDB 對各家 OS 支援度很高,今天測試的環境是 Windows,所以我們就下載 Windows 的版本,我是下載了 zip 版本,下載後將壓縮檔案內 bin 資料夾下的檔案全部複製到 c:\mongodb
PHP 預設是沒有支援 MongoDB 的,但安裝方式很簡單,首先我們去下載 dll 檔案,下載最新的版本 php_mongo-1.5.7.zip
,解壓縮後選擇符合你 server 版本的 dll,將他複製到 PHP 的 ext 資料夾,並且更名為 php_mongo.dll,修改 php.ini
,加入 extension=php_mongo.dll
,重啟 Apache,接著看一下 phpinfo
,如果你看到以下的畫面,表示你已經成功了。
啟用
基本的 MongoDB 啟用很簡單,首先我在 c:\mongodb
下多建了一個 db
資料夾,接著啟用他。
mongod --dbpath="c:\mongodb\db"
如果沒有任何的錯誤訊息,恭喜你成功啟用了
使用
http://us3.php.net/manual/en/book.mongo.php
PHP 官方有非常詳細的使用文件,我們來看幾個比較常用的例子。
Connection
$m = new MongoClient();
$db = $m->selectDB('db');
若預設值如 ip 以及 port 沒改變的話,這是最基本的連線方式,當然還有其他的連線方式,甚至可以做到 replica。
$m = new MongoClient();
$db = $m->selectDB('db');
$users = $db->users;
echo $users->count(); // 0
MongoDB 的資料是一種 collection 的概念要存取相當簡單,上面的例子指定了 users
這個 connection,但我們沒有任何的資料,所以 count 的結果當然是 0,接下來我們塞一些資料進去。
$m = new MongoClient();
$db = $m->selectDB('db');
$users = $db->users;
$data = array(
'name' => 'Chan',
'age' => 34
);
$users->insert($data);
echo $users->count(); // 1
上面的例子我們使用了 insert
功能塞進了一筆資料,count 的結果就變成 1 了,如果 refresh 頁面的話數字就會變成 2,若要多重存取的話可以使用另一個 batchInsert
function。
$m = new MongoClient();
$db = $m->selectDB('db');
$users = $db->users;
$users->drop();
$data = array(
array(
'name' => 'Chan',
'age' => 34
),
array(
'name' => 'Phoebe',
'age' => 35
)
);
$users->batchInsert($data);
echo $users->count(); // 2
上面的範例為了避免資料重複的 insert,所以我多加了 $users->drop()
的 function,此時 count 的結果就為 2 了,接下來我們來抓取資料。
$m = new MongoClient();
$db = $m->selectDB('db');
$users = $db->users;
$users->drop();
$data = array(
array(
'name' => 'Chan',
'age' => 34
),
array(
'name' => 'Phoebe',
'age' => 35
)
);
$users->batchInsert($data);
foreach ($users->find() as $id => $item) {
echo 'id: ' . $id;
var_dump($item);
}
我們會得到
id: 545af6263ad521b819000031
array (size=3)
'_id' =>
object(MongoId)[9]
public '$id' => string '545af6263ad521b819000031' (length=24)
'name' => string 'Chan' (length=4)
'age' => int 34
id: 545af6263ad521b819000032
array (size=3)
'_id' =>
object(MongoId)[10]
public '$id' => string '545af6263ad521b819000032' (length=24)
'name' => string 'Phoebe' (length=6)
'age' => int 35
以上就是最基本的存跟取了,其他的條件式 PHP 官網有詳細的範例,SQL to Mongo Mapping Chart。
SQL Statement |
Mongo Query Language Statement |
CREATE TABLE USERS (a Number, b Number)
|
Implicit or use MongoDB::createCollection().
|
INSERT INTO USERS VALUES(1,1)
|
$db->users->insert(array("a" => 1, "b" => 1));
|
SELECT a,b FROM users
|
$db->users->find(array(), array("a" => 1, "b" => 1));
|
SELECT * FROM users WHERE age=33
|
$db->users->find(array("age" => 33));
|
SELECT a,b FROM users WHERE age=33
|
$db->users->find(array("age" => 33), array("a" => 1, "b" => 1));
|
SELECT a,b FROM users WHERE age=33 ORDER BY name
|
$db->users->find(array("age" => 33), array("a" => 1, "b" => 1))->sort(array("name" => 1));
|
SELECT * FROM users WHERE age>33
|
$db->users->find(array("age" => array('$gt' => 33)));
|
SELECT * FROM users WHERE age<33
|
$db->users->find(array("age" => array('$lt' => 33)));
|
SELECT * FROM users WHERE name LIKE "%Joe%"
|
$db->users->find(array("name" => new MongoRegex("/Joe/")));
|
SELECT * FROM users WHERE name LIKE "Joe%"
|
$db->users->find(array("name" => new MongoRegex("/^Joe/")));
|
SELECT * FROM users WHERE age>33 AND age<=40
|
$db->users->find(array("age" => array('$gt' => 33, '$lte' => 40)));
|
SELECT * FROM users ORDER BY name DESC
|
$db->users->find()->sort(array("name" => -1));
|
CREATE INDEX myindexname ON users(name)
|
$db->users->ensureIndex(array("name" => 1));
|
CREATE INDEX myindexname ON users(name,ts DESC)
|
$db->users->ensureIndex(array("name" => 1, "ts" => -1));
|
SELECT * FROM users WHERE a=1 and b='q'
|
$db->users->find(array("a" => 1, "b" => "q"));
|
SELECT * FROM users LIMIT 20, 10
|
$db->users->find()->limit(10)->skip(20);
|
SELECT * FROM users WHERE a=1 or b=2
|
$db->users->find(array('$or' => array(array("a" => 1), array("b" => 2))));
|
SELECT * FROM users LIMIT 1
|
$db->users->find()->limit(1);
|
EXPLAIN SELECT * FROM users WHERE z=3
|
$db->users->find(array("z" => 3))->explain()
|
SELECT DISTINCT last_name FROM users
|
$db->command(array("distinct" => "users", "key" => "last_name"));
|
SELECT COUNT(*y) FROM users
|
$db->users->count();
|
SELECT COUNT(*y) FROM users where AGE > 30
|
$db->users->find(array("age" => array('$gt' => 30)))->count();
|
SELECT COUNT(AGE) from users
|
$db->users->find(array("age" => array('$exists' => true)))->count();
|
UPDATE users SET a=1 WHERE b='q'
|
$db->users->update(array("b" => "q"), array('$set' => array("a" => 1)));
|
UPDATE users SET a=a+2 WHERE b='q'
|
$db->users->update(array("b" => "q"), array('$inc' => array("a" => 2)));
|
DELETE FROM users WHERE z="abc"
|
$db->users->remove(array("z" => "abc"));
|
管理工具
Robomongo