PHP中MongoDB資料庫的連線、新增、修改、查詢、刪除等操作例項
PHP 擴充套件mongon.mod.dll下載http://cn.php.net/manual/en/mongo.installation.php#mongo.installation.windows
然後php.ini新增 extension=php_mongo.dll
最後phpinfo() 查詢到
表標PHP已經自帶了mongo功能,你就可以操作下面的程式碼(但是你必須有安裝mongodb伺服器)
一、連線資料庫
使用下面的程式碼建立一個數據庫連結
$connection = new Mongo(mongodb://192.168.1.5:27017); //連結到 192.168.1.5:27017//27017埠是預設的。
$connection = new Mongo( "example.com" ); //連結到遠端主機(預設埠)
$connection = new Mongo( "example.com:65432" ); //連結到遠端主機的自定義的埠
print_r($connection->listDBs());//能打印出資料庫陣列,看看有幾個資料庫。
?>
如圖:
上圖說有一個數據庫名字叫local,總大小1個位元組,他是空的。看見ok表示執行成功。
現在你可以使用$connection連結來操作資料庫了
選擇資料庫
使用下面的程式碼來選擇一個數據庫
$db = $connection->dbname;
?>
這裡的資料庫並不一定是一個已經存在的資料庫,如果所選擇的資料庫不存在,則會新建一個數據庫,所以在選擇資料庫的時候,注意一定要填上正確的資料庫名
如果拼寫錯誤的話,很有可能會新建一個數據庫
$db = $connection->mybiglongdbname;
//做一些事情
$db = $connection->mybiglongdbnme;
//現在會連上一個新的資料庫
?>
獲取一個集合
獲取一個集合跟選擇資料庫擁有相同的語法格式
$db = $connection->baz;//選擇資料庫
$collection = $db->foobar;//選擇foobar集合
//或者使用更簡潔的方式
$collection = $connection->baz->foobar;
?>
插入一個文件
多維陣列是可以被儲存到資料庫中的基本單元
一個隨機的文件可能是這樣
$doc = array(
”name” => “MongoDB”,
“type” => “database”,
“count” => 1,
“info” => (object)array( “x” => 203,
“y” => 102),
“versions” => array(“0.9.7″, “0.9.8″, “0.9.9″)
);
?>
注意:你可以巢狀陣列與物件,物件與文件在mongodb中幾乎是一樣的,你可以使用$doc呼叫一個文件或物件,但是info欄位總是一個物件而不是一個文件,
本約束適用於所有文件
使用MongoCollection::insert()插入一個文件
$m = new Mongo();
$collection = $m->foo->bar;
$collection->insert($doc);
?>
mongodb 的 insert()、save() ,區別主要是:若存在主鍵,insert() 不做操作,而save() 則更改原來的內容為新內容。
存在資料: { _id : 1, " name " : " n1 " }
insert({ _id : 1, " name " : " n2 " }) 會提示錯誤
save({ _id : 1, " name " : " n2 " }) 會把 n1 改為 n2 。
使用MongoCollection::findOne()查詢文件
為了證明上面那段程式碼的資料已經插入到資料庫裡了,我們進行簡單的 findOne()操作以得到集合中的第一個文件資料,這種方法只返回一個文件資料,
這種方法適用於在你的查詢語句的時候只匹配一個文件或者你只關心第一條資料
$obj = $collection->findOne();
var_dump( $obj );
?>
你會看到下列結果
["_id"]=>
object(MongoId)#6 (0) {
}
["name"]
string(7) “MongoDB”
["type"]=>
string(8) “database”
["count"]=>
int(1)
["info"]=>
array (2) {
["x"]=>
int(203)
["y"]=>
int(102)
}
["versions"]
array(3) {
[0]=>
string(5) “0.9.7″
[1]=>
string(5) “0.9.8″
[2]=>
string(5) “0.9.9″
}
}
注意_id欄位自動載入了文件上,MongoDB儲存元素中以_以及$開頭的都是供內部使用的
新增更多文件
為了做一些更有趣的事情,我們新增更多簡單的文件到集合中,這些文件如下
array( “i” => value );
?>
我們可以使用迴圈相當有效的插入資料
複製程式碼 程式碼如下: <?php
for($i=0; $i<100; $i++) {
$collection->insert( array( “i” => $i ) );
}
?>
注意:我們可以插入不同的欄位在同一字符集中,在這方面意味著MongoDB擁有非常自由的儲存模式
在一個集合中計算文件的數量
現在我們插入了101個文件(我們用迴圈插入了100個,之前還插入了一個),我們可以使用count()來看看我們的資料是不是都被插入進去了
<?php
echo $collection->count();
?>
這段程式碼將打印出101
MongoCollection::count() 也可以查詢欄位資料
使用遊標得到集合中的所有文件
為了得到集合中的所有文件,我們可以使用 MongoCollection::find()方法,find()方法返回一個 MongoCursor物件,可以讓我們重複得到查詢所匹配的的文件
$cursor = $collection->find();
foreach ($cursor as $id => $value) {
echo “$id: “;
var_dump( $value );
}
?>
這樣我們會打印出集合中的這101個文件,$id就是文件中的_id欄位,$value 就是文件本身
為查詢規定一個標準
我們可以通過find()方法得到集合中的文件子集,例如,我們要查詢出集合中i欄位為71的文件,我們可以使用下列方法
$query = array( “i” => 71 );
$cursor = $collection->find( $query );
while( $cursor->hasNext() ) {
var_dump( $cursor->getNext() );
}
?>
我們將列印如下資料
複製程式碼 程式碼如下: array(2) {
["_id"]=>
object(MongoId)#6 (0) {
}
["i"]=>
int(71)
["_ns"]=>
“testCollection”
}
為查詢設定一個範圍
我們可以通過find()建立一個查詢語句以得集合中的一個子集,例如如果我們得到所有”i”>50的文件,我們可以使用如下程式碼
$query = array( “i” => array(‘$gt' =>50)); //注意'$gt'兩邊的單引號
$cursor = $coll->find( $query );
while( $cursor->hasNext() ) {
var_dump( $cursor->getNext() );
}
?>
我們同樣可以得到20 < i <= 30之間的資料
$query = array( “i” => array( “\$gt” => 20, “\$lte” => 30 ) );
$cursor = $coll->find( $query );
while( $cursor->hasNext() ) {
var_dump( $cursor->getNext() );
}
?>
我們非常容易漏掉$美元符號,你也可以選擇你自定義的符號來代替美元符號,選擇一個不會在你的建裡面出現的符號例如”:”,在php.ini中加上這麼一句話
那麼上面的程式碼就可以替換成
複製程式碼 程式碼如下: <?php
$query = array( “i” => array( “:gt” => 20, “:lte” => 30 ) );
?>
當然你也可以使用ini_set(“mongo.cmd”, “:”)的方法來改變
建立一個索引
MongoDB支援索引,並且可以很容易的加到一個集合中,你只要指定某個欄位為索引就行了,並且還可以指定 正序索引(1)與 倒序索引(-1)
下面的程式碼為I建立了索引
$coll->ensureIndex( array( “i” => 1 ) ); //在”i”上建立了一個索引
$coll->ensureIndex( array( “i” => -1, “j” => 1 ) );//在”i”上建立了倒序索引 在”j”上建立了正序索引
?>
一個完整的簡單例子
這個例子展示瞭如何連結mongodb資料庫,如何選擇資料庫,如何插入資料,如何查詢資料,以及關閉資料庫連結
//連結
$m = new Mongo();
// 選擇一個數據庫
$db = $m->comedy;
$collection = $db->cartoons;
//新增一個元素
$obj = array( "title" => "Calvin and Hobbes", "author" => "Bill Watterson" );
$collection->insert($obj);
//修改
$newdata = array('$set' => array("title" => "Calvin and Hobbes"));
$collection->update(array("author" => "caleng"), $newdata);
//刪除
$collection->remove(array('author'=>'caleng'), array("justOne" => true));
//新增另一個元素,使用不同的格式
$obj = array( "title" => "XKCD", "online" => true );
$collection->insert($obj);
//查詢所有的集合
$cursor = $collection->find();
//重複顯示結果
foreach ($cursor as $obj) {
echo $obj["title"] . "\n";
}
// 關閉連結
$m->close();
?>
輸出結果為
複製程式碼 程式碼如下: Calvin and Hobbes
XKCD