1. 程式人生 > >PHP操作mongodb--study

PHP操作mongodb--study

基礎教程:

1.連線mongo資料庫伺服器。

語法範例:

<?php
$connection = new MongoClient(); // 連線到本地資料庫,預設埠為27017.即:localhost:27017
$connection = new MongoClient( "mongodb://example.com" ); // 連線遠端資料庫,預設埠為27017
$connection = new MongoClient( "mongodb://example.com:65432" ); // 連線遠端資料庫,埠號為指定的埠號。
?>

2.連線一個數據庫

語法範例:

<?php
$connection = new MongoClient();//連線到本地資料庫,預設埠:27017
$db = $connection->dbname;//選擇資料庫名為dbname的資料庫
?>
資料庫名不用事先建立,當你選擇它時,mongodb可以建立一個新的名為dbname資料庫。

注意:不要寫錯資料庫名,否則你回不經意間生成一個數據庫,這會導致資料庫混亂。

以下程式會因拼寫錯誤生成兩個資料庫:

<?php
$connection = new MongoClient();
$db = $connection->mybiloglongdbname;//連線一個數據庫
$db = $connection->mybiloglongdbanme;//連線一個不一樣名字的資料庫
 ?>

3.連線一個數據庫集合

獲取一個集合和連線一個數據庫語法是相同的。

語法範例:

<?php
$connection = new MongoClient();
$db = $connection->baz;
$collection = $db->foobar;//選擇一個集合
//也可以直接選擇一個數據庫和一個集合
$collection = $connection->baz->foobar;
?>
集合和關係型資料庫中的表類似。

4.插入一個文件

關聯陣列是最基本的結構,它儲存到集合中。

一些隨機的"文件"可以是:

<?php 
$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")
);
?>
注意:你可以有巢狀的陣列和物件。驅動程式通常將一個關聯陣列作為一個數據庫中的對像來儲存。

一個數字索引陣列通常按以下情況作為一個數組來儲存:關鍵字從0開始,不間斷。或者作為一個物件

:陣列的關鍵字不是從0開始,中間會有間斷。

插入這個文件,可以用這個函式 MongoCollection::insert():

<?php
$connection = new MongoClient();
$collection = $connection->database->collectionName;
$collection->insert($doc);
?>

5,查詢一個集合使用 MongoCollection::findOne()

為了能搜尋出集合資料,我們事先已經在資料庫中儲存了相應的資料。我們只需要一個簡單的方法 

MongoCollection::findOne() 便可以從集合中取到唯一的文件。這個方法適用於:只有唯一的一條資料匹配

查詢資料。

例項:

<?php 
$connection = new MongoClient();
$collection = $connection->database->collectionName;
$document = $collection->findOne();
var_dump($document);
?>
以上例項輸出:
array(6) {
["_id"]=>
object(MongoId)#8 (1) {
["$id"]=>
string(24) "4e2995576803fab768000000"
}
["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”的欄位已經被自動加到文件中,_id 是主鍵欄位。

如果文件沒有定義主鍵欄位,驅動程式會自動新增一個。

若你定義一個你自己的_id欄位,它必須對於整個集合是獨一無二的。

例子:

<?php
$connection = new MongoClient();
$db = $connection->datebase;
$db->foo->insert(array("_id"=>1));
//下面這個將丟擲一個異常
$db->foo->insert(array("_id"=>1));
//下面這個是正確的,因為這個是在另外一個集合中
$db->bar->insert(array("_id"=>1));
?>
你也可以通過傳遞陣列("w"=>0)作為第二個元素,選擇關閉該行為。

也就是說驅動程式不必等待資料庫去確認寫,也不必丟擲複製_id的異常。

6.新增多個文件

為了讓我們做更多有意思的事情,我們來新增許多簡單的文件給集合。

這些文件僅僅是這種形式的資料array("i"=>value),我們可以在一個迴圈中相當有效率的新增上。

<?php
$connection = new MongoClient();
$collection = $connection->database->collectionName;
for($i=0;$i<100;$i++)
{
$collection->insert(array('i'=>$i, "field{$i}"=>$i*2));
}
?>
注意:我們可以插入關鍵字不同的文件在同一個集合中,這也就是為什麼我們稱MongoDB是模式自由。

7.統計一個集合中文件數目

當我們在集合中插入101個文件時,我們可以用方法MongoCollection::count()來統計文件數:

<?php
$connection = new MongoClient();
$collection = $connection->database->collectionName;
echo $collection->count();
?>
輸出結果為:101

8.運用Cursor得到所有的文件

為了得到集合中所有的文件,我們將用MongoCollection::find()。

find()方法可以返回一個MongoCursor物件,這個物件允許我們可以迭代出符合我們查詢條件的文件。

然後 查詢所有文件,並打印出來。

<?php
$connection = new MongoClient();
$collection = $connection->database->collectionName;
$cursor = $collection->find();
foreach($cursor as $id=>$value)
{
echo "$id:";
var_dump($value);
}
?>
可以打印出集合中所有的文件。

$id i是 文件的_id欄位,$value是文件本身。

9.設定查詢標準

我們可以用一條查詢語句通過方法 MongoCollection::find()來獲得集合中文件的一個子集。

例如:如果你想找到  "i"欄位的值為71的文件,我們可以按下面的做法去做:

<?php
$connection = new MongoClient();
$collection = $connection->database->collectionName;
$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"
}

10.查詢一系列文件

我們可以從集合中查詢一系列文件。

例如,如果你想獲得‘i’>50的所有文件,我們可以按下面這樣去寫

<?php
$connection = new MongoClient();
$collection = $connection->database->collectionName;
$query = array("i"=>array('$gt'=>50));
$cursor = $coll->find($query);
while($cursor->hasNext())
{
var_dump($cursor->getNext());
}
?>
我們也可以查詢一個範圍:比如 20<i<=30
<?php
$connection = new MongoClient();
$collection = $connection->db->collectionName;
$query = array('i'=>array('$gt'=>20,"\$lte"=>30));
$cursor = $collection->find($query);
while($cursor->hasNext)
{
var_dump($cursor->getNext());
}
?>
$gt 大於; $gte 大於等於 ; $in  範圍 ; $it 小於;$lte小於等於;  
find( { qty: { $in: [ 5, 15 ] } } )

$ne 查詢所有不等於該元素的資料;

$nin 查詢不在範圍內的所有資料

另外注意:單引號下$字元不需要轉義字元,但是雙引號下需要轉義字元

11.建立一個索引

MongoDB支援索引,而且索引可以非常容易的加到集合中。

為了建立一個索引,你需要定義一個欄位和方向:升序(1)或者降序(-1)。

以下建立了一個升序的索引在‘i’欄位上:

<?php
$connection = new MongoClient();
$collection = $collection->database->collectionName();
$collection->ensureIndex(array("i"=>1));//建立一個在‘i’上升序的索引
$collection->ensureIndex(array("i"=>-1, "j"=>1));//建立一個在‘i’上降序,在‘j’上升序的索引。
?>
當資料增長時,索引就成了資料庫良好的讀取效能的關鍵。
如果你對索引讀取效能還不熟悉,你可以參考MongoCollection::ensureIndex()MongoCollection::ensureIndex()的相關文件。

參考:http://www.php.net/manual/zh/mongo.tutorial.connecting.php