天天看點

PHP操作MongoDB學習

原文:http://www.open-open.com/lib/view/open1325589618718.html

1  mongodb啟動時,設定啟動項 

C:\>mongodb\bin\mongod --config C:\mongodb.conf 

其中mongodb.conf為: 

   dbpath = D:\mongodb_data 

    logpath = D:\mongodb.log 

    logappend = true 

 如果是linux的話,則mongod --config /etc/mongodb.conf 

2 停止server 

    db.shutdownServer() 

3 常用操作: 

   use myfirstdb 

  插入db 

   db.movies.insert({name:"Source Code", genre:"sci-fi", year:2011}) 

   查找所有記錄 

   db.movies.find() 

4 php 5.2 mongo driver下載下傳: 

http://downloads.mongodb.org/mongo-latestphp5.2vc6ts. 

zip 

  5.3 mongo driver下載下傳: 

  http://downloads.mongodb.org/mongo-latest-php5.3vc6ts.zip 

   把DLL複制到extension目錄,然後 

extension=php_mongo.dll即可 

5 列出目前資料庫的php mongodb程式 

01

<?php

02

try{

03

$mongo

new

Mongo(); 

//create a connection to MongoDB

04

$databases

$mongo

->listDBs(); 

//List all databases

05

echo

'<pre>'

;

06

print_r(

$databases

);

07

$mongo

->close();

08

} catch(MongoConnectionException 

$e

) {

09

//handle connection error

10

die

(

$e

->getMessage());

11

}

12

?>

    如果是連接配接時用不同的端口,構造函數中用: 

$mongo = new Mongo($server="mongodb://localhost:8888"); 

  也可以指定timeout的政策; 

1

try {

2

$mongo

new

Mongo(

$options

=

array

(

'timeout'

=> 100))

3

} catch(MongoConnectionException 

$e

) {

4

die

(

"Failed to connect to database "

.

$e

->getMessage());

5

}

6 通過PHP儲存對象到mongo db中 

01

$connection

new

Mongo();

02

$database

$connection

->selectDB(

'myblogsite'

);

03

$collection

$database

->selectCollection(

'articles'

);

04

05

$article

array

();

06

$article

[

'title'

]      = 

$_POST

[

'title'

];

07

$article

[

'content'

]    = 

$_POST

[

'content'

];

08

$article

[

'saved_at'

] = 

new

MongoDate();

09

10

$collection

->insert(

$article

);

      注意的是,預設不用顯式create database即可,如果不存在則會自動 

建立立database,也可以: 

01

$connection

new

Mongo();

02

$collection

$connection

->myblogsite->articles;

03

mongodb的插入是異步的,如果不想異步,可以這樣;

04

try {

05

$status

$connection

->insert(

array

(

'title'

=> 

'Blog Title'

,

06

'content'

=> 

'Blog Content'

),

07

array

(

'safe'

=> True));

08

echo

"Insert operation complete"

;

09

} catch (MongoCursorException 

$e

) {

10

die

(

"Insert failed "

.

$e

->getMessage());

11

}

  則必須等插入完成後才傳回給使用者,繼續執行下一條語句 

    也可以指定timeout的政策: 

    $collection->insert($document, array('safe' => True, 

'timeout' => True)); 

7 設定自己的自增id 

    $document = array('_id' => hash('sha1', $username.time()), 

     将設定id為username後加上目前時間再hash. 

8 日期設定 

1

$article

[

'saved_at'

] = 

new

MongoDate();

2

$timestamp

new

MongoDate(

strtotime

(

'2011-05-21 12:00:00'

));

3

print 

date

(

'g:i a, F j'

$timestamp

->sec); 

//prints 12 pm, May 21

4

5

$lastweek

new

MongoDate(

strtotime

(

'-1 week'

));  

//找出一個星期以來的記錄

6

$cursor

$articleCollection

->find(

array

(

'saved_at'

=>

7

array

(

'$gt'

=> 

$lastweek

)));

   指定一定範圍内的記錄: 

1

$start

new

MongoDate(

strtotime

(

'2011-05-01 00:00:00'

));

2

$end

new

MongoDate(

strtotime

(

'2011-05-31 23:59:59'

));

3

$articleCollection

->find(

array

(

'saved_at'

=>

4

array

(

'$gte'

=> 

$start

,

5

'$lte'

=> 

$end

)));

9 列出某個表的所有記錄 

   $cursor = $collection->find(); 

   <?php while ($cursor->hasNext()): 

$article = $cursor->getNext(); ?> 

<h2><?php echo $article['title']; ?></h2> 

  ............ 

  找某條記錄:$article = $collection->findOne(array('_id'=> 

new MongoId($id))); 

    查找時也可以傳入多個參數: 

$moviesCollection->find(array('genre' => 'comedy', 'year' => 2011)); 

   if ($cursor->count() === 0)  //如果找不到 

   如果查詢多個條件: 

   $collection->find(array('x' => array('$gt' => 100))); 

//$ is escaped within double quotes (") 

$collection->find(array('x' => array("\$gt" => 100))); 

   注意要用單引号,如果要用雙引号,則要加上轉義符。 

10 排序: 

     $cursor->sort(array('saved_at' => -1)) //按save_at字段降序排列,1為升序 

11 skip和limit: 

      $cursor = $articleCollection->find(); 

//skip the first five articles in the cursor 

$cursor->skip(5); 

     $cursor->limit(10);//結果集隻取10條 

12 更新資料庫 

   $articleCollection->update(array('_id' => new MongoId($id)), 

$article); 

   第一個參數為指定的條件(更新條件),第二個參數為要更新的對象 

還有可選參數如下; 

   $collection->update($criteria, $newobj, array('safe' => True)); 

   safe=true時,等到UPDATE結束才傳回結果 

  mongodb還支援upsert的操作:如果存在則更新,如果不存在則插入 

    $users->update(array('email' => '[email protected]'), 

array('firstname' => 'Alice', 'lastname'=> 'Liddell'), 

array('upsert' => True)); 

     這裡對email為[email protected]的記錄進行更新其firstname,lastname字段的内容 

13 修飾符 

     比如set,隻修改記錄的某個部分,可以這樣: 

   $articles->update(array('_id' => MongoId('4dcd2abe5981')), 

array('$set' => array('title' => 'New 

Title'))); 

   使用inc: 

     $articles->update(array('_id' => MongoId('4dcd2abe5981')), 

array('$set' => array('content' => 'New Content'), 

'$inc' => array('update_count' => 1))); 

    将update_count+1 

   unset: 

   $articles->update(array('_id' => MongoId('4dcd2abe5981')), 

array('$unset' => array('title' => True))); 

   将title field從這個document中移除 

  更名rename: 

$articles->update(array(), 

array('$rename' => array('saved_at' => 

'created_at')), 

array('multiple' => True)); 

将save_at更名為create_at 

14 删除記錄 

   $articleCollection->remove(array('_id' => new MongoId($id))); 

  $movies->remove(array('genre' =>'drama'), 

array('justOne' => True)); 

  如果加了justOne的參數,則隻删除符合條件的一條記錄而已,其他不删除 

15 document的關系 

  1)嵌套 

     { 

"_id" : ObjectId("4dd491695072aefc456c9aca"), 

"username" : "alphareplicant", 

"email" : "[email protected]", 

"fullname" : "Roy Batty", 

"joined_at" : ISODate("2011-05-19T03:41:29.703Z"), 

"address" : { 

"street" : "13 Tannhauser Gate", 

"city" : "Caprica", 

"state" : "CC", 

"zipcode" : 512 

}, 

  2)引用 

    { 

_id : ObjectId("4dcd2abe5981aec801010000"), 

title : "The only perfect site is hind-site", 

content : "Loren ipsum dolor sit amet…", 

saved_at : ISODate('2011-05-16T18:42:57.949Z'), 

author_id : ObjectId("4dd491695072aefc456c9aca") 

  3)比如一個一對多的關系: 

     比如一個文章下的評論: 

    $comment = array( 

'name' => $_POST['commenter_name'], 

'email' => $_POST['commenter_email'], 

'comment' => $_POST['comment'], 

'posted_at' => new MongoDate() 

); 

    $collection->update(array('_id' => new MongoId($id)), 

array('$push' => array('comments' => 

$comments))); 

   使用的是$push的修飾符,一般來說,用内嵌的document效率比較高 

或者: 

01

$article

$articleCollection

->findOne(

array

(

'_id'

=> 

new

MongoId(

$id

)));

02

03

$comments

= (isset(

$article

[

'comments'

])) ? 

$article

[

'comments'

] : 

array

();

04

05

$comment

array

(

06

'name'

=> 

$_POST

[

'commenter_name'

],

07

'email'

=> 

$_POST

[

'commenter_email'

],

08

'comment'

=> 

$_POST

[

'comment'

],

09

'posted_at'

=> 

new

MongoDate()

10

);

11

12

array_push

(

$comments

$comment

);

13

14

$articleCollection

->update(

array

(

'_id'

=> 

new

MongoId(

$id

)), 

array

(

'$set'

=>

array

(

'comments'

=>

15

16

$comments

)));

  使用.号來查詢子嵌套文檔 

  { 

name : "Gordon Freeman", 

address : { 

city : "Springfield", 

state : "Florida" 

  { 

name : "Lara Croft", 

address : { 

city : "Miami", 

state: "Florida" 

  則查詢address中state為florida的document: 

  $users->find(array('address.city' => 'Springfield', 

'address.state' => 'Florida')); 

Mongo是一個高性能,開源,模式自由(schema-free)的文檔型資料庫,它在許多場景下可用于替代傳統的關系型資料庫或鍵/值(key-value)存儲方式。Mongo使用C++開發,具有以下特性:

l 面向集合的存儲:适合存儲對象及JSON形式的資料。

l 動态查詢:Mongo支援豐富的查詢表達式。查詢指令使用JSON形式的标記,可輕易查詢文檔中内嵌的對象及數組。

l 完整的索引支援:包括文檔内嵌對象及數組。Mongo的查詢優化器會分析查詢表達式,并生成一個高效的查詢計劃。

l 查詢監視:Mongo包含一個監視工具用于分析資料庫操作的性能。

l 複制及自動故障轉移:Mongo資料庫支援伺服器之間的資料複制,支援主-從模式及伺服器之間的互相複制。複制的主要目标是提供備援及自動故障轉移。

l 高效的傳統存儲方式:支援二進制資料及大型對象(如照片或圖檔)。

l 自動分片以支援雲級别的伸縮性(處于早期alpha階段):自動分片功能支援水準的資料庫叢集,可動态添加額外的機器。

模式自由(schema-free),意味着對于存儲在mongodb資料庫中的檔案,我們不需要知道它的任何結構定義。如果需要的話,你完全可以把不同結構的檔案存儲在同一個資料庫裡。

存儲在集合中的文檔,被存儲為鍵-值對的形式。鍵用于唯一辨別一個文檔,為字元串類型,而值則可以是各中複雜的檔案類型。我們稱這種存儲形式為BSON(Binary Serialized dOcument Format)。

MongoDB服務端可運作在Linux、Windows或OS X平台,支援32位和64位應用,預設端口為27017。推薦運作在64位平台,因為MongoDB在32位模式運作時支援的最大檔案尺寸為2GB。

MongoDB把資料存儲在檔案中(預設路徑為:/data/db),為提高效率使用記憶體映射檔案進行管理。

MongoDB的主要目标是在鍵/值存儲方式(提供了高性能和高度伸縮性)以及傳統的RDBMS系統(豐富的功能)架起一座橋梁,集兩者的優勢于一身。

根據項目首頁的描述,Mongo适合用于以下場景:

l 網站資料:Mongo非常适合實時的插入,更新與查詢,并具備網站實時資料存儲所需的複制及高度伸縮性。

l 緩存:由于性能很高,Mongo也适合作為資訊基礎設施的緩存層。在系統重新開機之後,由Mongo搭建的持久化緩存層可以避免下層的資料源過載。

l 大尺寸,低價值的資料:使用傳統的關系型資料庫存儲一些資料時可能會比較昂貴,在此之前,很多時候程式員往往會選擇傳統的檔案進行存儲。

l 高伸縮性的場景:Mongo非常适合由數十或數百台伺服器組成的資料庫。Mongo的路線圖中已經包含對MapReduce引擎的内置支援。

l 用于對象及JSON資料的存儲:Mongo的BSON資料格式非常适合文檔化格式的存儲及查詢。

自然,MongoDB的使用也會有一些限制,例如它不适合:

l 高度事務性的系統:例如銀行或會計系統。傳統的關系型資料庫目前還是更适用于需要大量原子性複雜事務的應用程式。

l 傳統的商業智能應用:針對特定問題的BI資料庫會對産生高度優化的查詢方式。對于此類應用,資料倉庫可能是更合适的選擇。

l 需要SQL的問題

MongoDB支援OS X、Linux及Windows等作業系統,并提供了Python,PHP,Ruby,Java及C++語言的驅動程式,社群中也提供了對Erlang及.NET等平台的驅動程式。