PHP操做MongoDB學習(轉)

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程序 php

?
1
2
3
4
5
6
7
8
9
10
11
12
    <?php
try {
$mongo new Mongo();  //create a connection to MongoDB
$databases $mongo ->listDBs();  //List all databases
echo '<pre>' ;
print_r( $databases );
$mongo ->close();
catch (MongoConnectionException  $e ) {
//handle connection error
die ( $e ->getMessage());
}
?>


    若是是鏈接時用不一樣的端口,構造函數中用: 
$mongo = new Mongo($server="mongodb://localhost:8888"); 
  也能夠指定timeout的策略; html

?
1
2
3
4
5
   try {
$mongo new Mongo( $options = array ( 'timeout' => 100))
catch (MongoConnectionException  $e ) {
die ( "Failed to connect to database " . $e ->getMessage());
}


   
6 經過PHP保存對象到mongo db中 linux

?
1
2
3
4
5
6
7
8
9
10
$connection new Mongo();
         $database   $connection ->selectDB( 'myblogsite' );
         $collection $database ->selectCollection( 'articles' );
        
         $article               array ();
         $article [ 'title' ]      =  $_POST [ 'title' ];
         $article [ 'content' ]    =  $_POST [ 'content' ];
         $article [ 'saved_at' ] =  new MongoDate();
        
         $collection ->insert( $article );



      注意的是,默認不用顯式create database便可,若是不存在則會自動 
新創建database,也能夠: android

?
1
2
3
4
5
6
7
8
9
10
11
    $connection new Mongo();
$collection $connection ->myblogsite->articles;
     mongodb的插入是異步的,若是不想異步,能夠這樣;
    try {
$status $connection ->insert( array ( 'title' =>  'Blog Title' ,
'content' =>  'Blog Content' ),
array ( 'safe' => True));
echo "Insert operation complete" ;
catch (MongoCursorException  $e ) {
die ( "Insert failed " . $e ->getMessage());
}


  則必須等插入完成後才返回給用戶,繼續執行下一條語句 
    也能夠指定timeout的策略: 
    $collection->insert($document, array('safe' => True, 
'timeout' => True)); 

7 設置本身的自增id 
   
    $document = array('_id' => hash('sha1', $username.time()), 
     將設置id爲username後加上當前時間再hash. 

8 日期設置 程序員

?
1
2
3
4
5
6
7
    $article [ 'saved_at' ] =  new MongoDate();
    $timestamp new MongoDate( strtotime ( '2011-05-21 12:00:00' ));
print date ( 'g:i a, F j' $timestamp ->sec);  //prints 12 pm, May 21
 
    $lastweek new MongoDate( strtotime ( '-1 week' ));   //找出一個星期以來的記錄
$cursor $articleCollection ->find( array ( 'saved_at' =>
array ( '$gt' =>  $lastweek )));



   指定必定範圍內的記錄: mongodb

?
1
2
3
4
5
    $start new MongoDate( strtotime ( '2011-05-01 00:00:00' ));
$end new MongoDate( strtotime ( '2011-05-31 23:59:59' ));
$articleCollection ->find( array ( 'saved_at' =>
array ( '$gte' =>  $start ,
'$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' => 'alice@wonderland.com'), 
array('firstname' => 'Alice', 'lastname'=> 'Liddell'), 
array('upsert' => True)); 

     這裏對email爲alice@wonderland.com的記錄進行更新其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" : "roybatty@androids.org", 
"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效率比較高 
或者: 數據庫

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    $article $articleCollection ->findOne( array ( '_id' =>  new MongoId( $id )));
 
$comments = (isset( $article [ 'comments' ])) ?  $article [ 'comments' ] :  array ();
 
$comment array (
                     'name' =>  $_POST [ 'commenter_name' ],
                     'email' =>  $_POST [ 'commenter_email' ],
                     'comment' =>  $_POST [ 'comment' ],
                     'posted_at' =>  new MongoDate()
                 );
                
array_push ( $comments $comment );
 
$articleCollection ->update( array ( '_id' =>  new MongoId( $id )),  array ( '$set' =>  array ( 'comments' =>
 
$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等平臺的驅動程序。

相關文章
相關標籤/搜索