1. 程式人生 > >PHP 操作MongoDB

PHP 操作MongoDB

1.MongoDB簡介

MongoDB 是由C++語言編寫的,是一個基於分散式檔案儲存的開源資料庫系統。

在高負載的情況下,新增更多的節點,可以保證伺服器效能。

MongoDB 旨在為WEB應用提供可擴充套件的高效能資料儲存解決方案。

MongoDB 將資料儲存為一個文件,資料結構由鍵值(key=>value)對組成。MongoDB 文件類似於 JSON 物件。欄位值可以包含其他文件,陣列及文件陣列。    

2.MongoDB特點

MongoDB的提供了一個面向文件儲存,操作起來比較簡單和容易。    

你可以在MongoDB記錄中設定任何屬性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")來實現更快的排序。

你可以通過本地或者網路建立資料映象,這使得MongoDB有更強的擴充套件性。

如果負載的增加(需要更多的儲存空間和更強的處理能力) ,它可以分佈在計算機網路中的其他節點上這就是所謂的分片。

Mongo支援豐富的查詢表示式。查詢指令使用JSON形式的標記,可輕易查詢文件中內嵌的物件及陣列。

MongoDb 使用update()命令可以實現替換完成的文件(資料)或者一些指定的資料欄位 。

Mongodb中的Map/reduce主要是用來對資料進行批量處理和聚合操作。

Map和Reduce。Map函式呼叫emit(key,value)遍歷集合中所有的記錄,將key與value傳給Reduce函式進行處理。

Map函式和Reduce函式是使用Javascript編寫的,並可以通過db.runCommand或mapreduce命令來執行MapReduce操作。

GridFS是MongoDB中的一個內建功能,可以用於存放大量小檔案。

MongoDB允許在服務端執行指令碼,可以用Javascript編寫某個函式,直接在服務端執行,也可以把函式的定義儲存在服務端,下次直接呼叫即可。

MongoDB支援各種程式語言:RUBY,PYTHON,JAVA,C++,PHP,C#等多種語言。

MongoDB安裝簡單。    

3.MongoDB安裝

在沒安裝mogonDB之前,我覺得它很難安裝成功,熟悉了安裝過程,其實很簡單。

在進行安裝,安裝成功後,在對應的盤建立data目錄,在data目錄下在建立db目錄,找到mongoDB安裝的位置,進入到bin目錄下,雙擊mongod.exe.會彈出一個命令框資訊,到此,mongoDB就安裝成功了。

問題:雙擊mongod.exe出現閃退的情況,在安裝MongoDB目錄下找到一個lock的檔案,刪除它,然後雙擊就不會出現閃退的現象

4.安裝php擴充套件

個人覺得這步是最煩的,我安裝好久才成功

4.1先檢視自己的php版本號,可以通過 訪問localhost/phpinfo.php檢視,建議上網查下需要了解的資訊

4.2下載php_mongo.dll對應得php版本號,這個很關鍵。

4.3在對應的環境下,我是在C:\phpstudy\php\php-5.4.45\ext放入下載的php_mongo.dll

4.4 在C:\phpstudy\php\php-5.4.45\php.ini配置檔案中 新增 extension=php_mongo.dll(建議放在很多個extension一塊)

4.5重啟伺服器。通過 訪問localhost/phpinfo.php檢視 出現 mongo代表安裝成功

5.php對mongoDB的操作

5.1 連線

$con=new MongoClient();

引數簡單說明:不寫代表 連線本地主機,預設埠

安整格式:(“mongodb://使用者名稱:密碼 @地址:埠/預設指定資料庫”,引數)

eg:(“mongodb://admin_miss:[email protected]:27017/test”,array(‘persist’=>’p',”replicaSet”=>true))

5.2 選擇資料庫

$db=$con->test;

或者 $db=$con->selectDB('test');

當test不存在時,會自動建立test資料庫,因此,在開發中不要寫錯單詞

5.3 選擇集合(在mysql中對應選擇表)

$collection=$db->column;

column不存在時會自動建立

5.4簡單寫法

$collection=$con->test->column;

5.5插入資料

<?php

header("content-type:text/html;charset=utf-8");

$t=new MongoClient(); //連線mongo

$m=$t->test;//選擇資料庫

$collection=$m->column; //選擇集合

$t=time();

$document=array(

    'title'=>'Mongo 教程',

    'data'=>'123456',

    'time'=>$t,

    'url'=>'http://www.baidu.com',

);

//插入資料

$collection->insert($document);

5.6查詢資料

<?php

header("content-type:text/html;charset=utf-8");

$t=new MongoClient(); //連線mongo

$m=$t->test;//選擇資料庫

$collection=$m->column; //選擇集合

$t=time();

$document=array(

    'title'=>'Mongo 教程',

    'data'=>'123456',

    'time'=>$t,

    'url'=>'http://www.baidu.com',

  

);

//查詢資料

$result=$collection->find();

foreach($result as $value){

    var_dump($value);

    echo "<br>";

}
查詢文件記錄數:

$collection->count(); #全部

$collection->count(array('title'=>'Mongo 教程')) ; #加上條件

$collection->count(array('age'=>array('$gt'=>10,'$lt'=>20))); #大於10,小於20

$collection->find()->limit(5)->skip(2); #limit 代表取的資料條數, skip代表從哪裡開始取(從0開始計數)

$collection->find()->snapshot(); # 得到聚合中所有的文件

查詢指定的id

$collection->find(array('_id'=>new MongoId('59bcd23a5c36b5940e000034')));
查詢指定的欄位

$result=$collection->find(array('title'=>'Mongo 教程','time'=>1505546761));
模糊查詢

$result=$collection->find(array('title'=>new MongoRegex('/user/'))); //  相當於 title like %user%    // '/user$/'  匹配以user結尾    '/^user/'  匹配以user開始
查詢一條資料

$collection->findOne();

注意:使用findOne()獲得的結果集不能使用snapshot(),fields()等函式

fields() 列顯示不顯示

$result=$collection->find()->fields(array('title'=>true));
true代表顯示該欄位的資料,反之 false代表不顯示該欄位的資料

注意:不能同時出現true和false

5.7修改資料

<?php

header("content-type:text/html;charset=utf-8");

$t=new MongoClient(); //連線mongo

$m=$t->test;//選擇資料庫

$collection=$m->column; //選擇集合

$t=time();

$document=array(

    'title'=>'Mongo 教程',

    'data'=>'123456',

    'time'=>$t,

    'url'=>'http://www.baidu.com',

   


);

//修改資料

$collection->update(array('title'=>'Mongo 教程'),array('$set'=>array('title'=>'Mongo')));

$result=$collection->find();

foreach($result as $value){

    var_dump($value);

    echo "<br>";

}
// 將username=user2 的 regtime+100

$con->update(array('username'=>'user2'),array('$inc'=>array('regtime'=>100)));
修改指定id的資料

$collection->update(array('_id'=>new MongoId('59bcd1ea5c36b51c1300002a')),array('$set'=>array('title'=>'Mongo 教程')))
比較下面三個例子

$where=array(‘column_name’=>’col123′);

$newdata=array(‘column_exp’=>’GGGGGGG’,'column_fid’=>444);

$result=$collection->update($where,array(‘$set’=>$newdata)); #$set:讓某節點等於給定值,類似的還有$pull $pullAll $pop $inc

/*

* 結果:

* 原資料

* {“_id”:ObjectId(“4d635ba2d549a02801000003″),”column_name”:”col123″,”column_exp”:”xiaocai”}

* 被替換成了

* {“_id”:ObjectId(“4d635ba2d549a02801000003″),”column_name”:”col123″,”column_exp”:”GGGGGGG”,”column_fid”:444}

*/

//** 替換更新 **/

$where=array(‘column_name’=>’col709′);

$newdata=array(‘column_exp’=>’HHHHHHHHH’,'column_fid’=>123);

$result=$collection->update($where,$newdata);

/*

* 結果:

* 原資料

* {“_id”:ObjectId(“4d635ba2d549a02801000003″),”column_name”:”col709″,”column_exp”:”xiaocai”}

* 被替換成了

* {“_id”:ObjectId(“4d635ba2d549a02801000003″),”column_exp”:”HHHHHHHHH”,”column_fid”:123}

*/

//** 批量更新 **/

$where=array(‘column_name’=>’col’);

$newdata=array(‘column_exp’=>’multiple’,’91u’=>684435);

$result=$collection->update($where,array(‘$set’=>$newdata),array(‘multiple’=>true));

/**

* 所有’column_name’='col’都被修改

*/    

5.8刪除資料

$collection->remove(); #刪除collection裡面的所有資料

<?php

header("content-type:text/html;charset=utf-8");

$t=new MongoClient(); //連線mongo

$m=$t->test;//選擇資料庫

$collection=$m->column; //選擇集合

$t=time();

$document=array(

    'title'=>'Mongo 教程',

    'data'=>'123456',

    'time'=>$t,

    'url'=>'http://www.baidu.com',

);

//刪除資料

$collection->remove(array('title'=>'Mongo'));  #刪除指定欄位條件資料
$collection->remove(array('_id'=>new MongoId('59bcd1ea5c36b51c1300002a')));   #刪除指定id資料
$collection->remove(array('title'=>'Mongo'),array('justOne'=>true)); #刪除指定欄位條件資料的一條記錄

5.9建立索引,排序

$collection->ensureIndex(array('savetime'=>-1));  //1升序,-1降序
$re = $collection->find()->sort(array('savetime'=>-1))->limit($pageSize)->skip($startPage);  // sort排序