MongoDBとPHPを始めよう

次世代の
過去1年間で、 Apache CouchDBなどのサーキットレス(構造化されていない)DBMSの出現に関連したDBMSの世界に小さな革命がありました。 これらのデータベースは、リレーショナルデータベースとは異なるアプローチを使用します。 それらは、柔軟性、シンプルさ、JSONなどの最新テクノロジーとの容易な統合により、Web開発者の間で急速に人気を博しています。
この記事では、開発者から多くの注目を集めている新世代の回路図フリーDBMSの1つであるMongoDBの簡単な概要を説明します。

起動して
MongoDBの公式Webサイトは、それが拡張可能で高性能なドキュメント指向のオープンソースデータベースであると述べています。 多数のプラットフォームがあり、GNU AGPLの下でライセンスされています。
MongoDBはCouchDBに似ていますが、それらの間には重大な違いがあります。

MongoDBのドキュメントには、これらの(およびもう少しの)違いのすべてが詳しく説明されています。MongoDB、CouchDB、MySQLを比較するテストもあります聖戦の別の理由 )。
MongoDBをダウンロードしてインストールする時間を簡単に確認します。 ほとんどの場合、標準のバイナリパッケージで十分です。 MongoDBとコマンドラインクライアント、バックアップ、リカバリ、およびバイナリファイルの保存と受信のためのユーティリティセットが含まれています。 開始するには、システムに適切なバージョンをダウンロードします。
shell> cd / usr / local
shell> tar -xzvf mongodb-linux-i686-1.4.2.tgz
shell> ln -s mongodb-linux-i686-1.4.2 mongo
Ubuntuを使用している場合、aptitudeを使用してMongoDBをインストールできます。 これを行うには、次の行を/etc/apt/sources.listに追加します。
deb downloads.mongodb.org/distros/ubuntu 10.4 10gen
次に、aptitudeを使用してこのパッケージをインストールします。
shell> aptitude update
shell> aptitude install mongodb-stable
パッケージがインストールされたら、MongoDBサーバーを起動します
shell> mkdir / usr / local / mongo / data
shell> / usr / local / mongo / bin / mongod --dbpath = / usr / local / mongo / data


デフォルトでは、MongoDBサーバーはデータが/ data / dbに保存されていると見なし、このパスが見つからない場合は終了することに注意してください。 --dbpathオプションを使用すると、別のパスを指定できます。
以下に示すように、コマンドラインを使用してサーバーにアクセスできます。
shell> / usr / local / mongo / mongo
これは次のようなものです。


MySQLクライアントだけでなく、サーバーにもコマンドを発行できます。 以下は、サーバーのバージョンと使用可能なデータベースを示す例です。
>show dbs
admin
local
>db.version()
1.4.2
>db.stats()
{
"collections" : 0,
"objects" : 0,
"dataSize" : 0,
"storageSize" : 0,
"numExtents" : 0,
"indexes" : 0,
"indexSize" : 0,
"ok" : 1
}

* This source code was highlighted with Source Code Highlighter .


アイデアを集める
MongoDBユニバースでは、テーブルに相当するものは「コレクション」です。 テーブルに多くのレコードがあるように、コレクションには多くの「ドキュメント」があります。 これらのドキュメントは、キーと値のペアを表すフィールドと値を持つJSONオブジェクトとして表され、ストレージ用にBSON(バイナリJSON)に格納(シリアル化)されます。 以下は、そのようなドキュメントの例です。
{
「OrderDate」:「10-05-2010」、
「OrderTotal」:468.99、
}
MongoDBの主要な要素はJSONドキュメントであり、JSONは階層データをサポートしているため、あるドキュメントを別のドキュメントに含めることができます。 さらに、ドキュメントは保存のためにBSONにシリアル化されるため、MongoDBは添付ドキュメントを簡単に検索できます。 以下に例を示します。
{
「OrderDate」:「10-05-2010」、
「OrderTotal」:468.99、
「ShipTo」:
{
「ストリート」:「17ヒルビュー」、
「Zip」:「12345」、
「国」:「米国」
}
}
新しいMongoDBコレクションを作成するには、コマンドラインでクライアントを実行し、次のコマンドを実行します。これにより、itemsというコレクションが作成され、いくつかのドキュメントが追加されます。
  1. > db.items。 挿入 ({名前: '卵' 、数量:10、価格:1.50})
  2. > db.items。 挿入 ({名前: 'bacon' 、数量:3、価格:3.50})
  3. > db.items。 挿入 ({名前: 'トマト​​' 、数量:30、価格:0.50})
*このソースコードは、 ソースコードハイライターで強調表示されました。

引き続き、上記のようにドキュメントを追加します。 コレクション内のドキュメントの完全なリストを表示するには、引数なしでfind()メソッドを呼び出します。
  1. > db.items.find({})
  2. {「_id」:ObjectId(「4bea15293302000000006dcf」)、「name」:「eggs」、「quantity」:10、「price」:1.5}
  3. {「_id」:ObjectId(「4bea15463302000000006dd0」)、「name」:「bacon」、「quantity」:3、「price」:3.5}
  4. {「_id」:ObjectId(「4bea15523302000000006dd1」)、「name」:「tomatoes」、「quantity」:30、「price」:0.5
  5. }
*このソースコードは、 ソースコードハイライターで強調表示されました。

各ドキュメントには特別なキー「_id」があります。 新しいドキュメントをコレクションに書き込むと、MongoDBは各ドキュメントに一意の識別子を自動的に追加します。 この識別子は、ドキュメントの取得または変更に使用できます。これは、リレーショナルデータベースの一種の自動インクリメントキーです。
任意の基準でドキュメントのリストを表示するには、この基準を(JSONオブジェクトとして)find()メソッドに追加します。 以下は、9を超える数量と1未満の価格のレコードを示す例です。
  1. > db.items.find({数量:{$ gt:9}、価格:{$ lt:1}})
  2. {「_id」:ObjectId(「4bea15523302000000006dd1」)、「name」:「tomatoes」、「quantity」:30、「price」:0.5
  3. }
*このソースコードは、 ソースコードハイライターで強調表示されました。

それでは、PHPで何かを書いてみましょう!

フックアップ
PHPのMongoDBサポートは、MongoDBコレクションにアクセスするためのAPIを提供する拡張機能によって実装されます。 この拡張機能はKristina Chodorowによって開発され、Apacheライセンスの下でPECLで無料で利用できます。 この拡張機能は安定しており、PHPで記述されたアプリケーションからMongoDBデータベースへのアクセスと使用に関連するほとんどのタスクを実行できます。
この拡張機能を使用するには、標準のpeclコマンドを使用してインストールします
shell> pecl install mongo
または、ソースコードをダウンロードして、PHPのロード可能なモジュールにコンパイルできます。
shell> tar -xzvf mongo-1.0.7.ta​​r.gz
shell> cd mongo-1.0.7
shell> phpize
shell> ./configure
シェル>メイク
shell> make install
これで、mongo.soというダウンロード可能なPHPモジュールが作成されました。このモジュールは、PHPモジュールの標準ディレクトリにあります。 この拡張機能をphp.iniに接続し、Webサーバーを再起動して、phpinfo()コマンドでこの拡張機能のアクティビティを確認します。


この拡張機能を使用してできることを見てみましょう
  1. <?php
  2. {
  3. // MongoDBサーバーへの接続を開きます
  4. $ conn = new Mongo( 'localhost' );
  5. //データベースにアクセスします
  6. $ db = $ conn->テスト;
  7. //コレクションにアクセスします
  8. $コレクション= $ db->アイテム;
  9. //クエリを実行します
  10. //すべてのドキュメントを取得します
  11. $ cursor = $ collection-> find();
  12. //結果セットを反復処理します
  13. //各ドキュメントを印刷します
  14. echo $ cursor-> count()。 'ドキュメントが見つかりました。 <br/> ' ;
  15. foreach ($ obj as $ obj){
  16. echo '名前:' 。 $ obj [ 'name' ]。 '<br/>' ;
  17. echo '数量:' 。 $ obj [ 'quantity' ]。 '<br/>' ;
  18. echo '価格:' $ obj [ '価格' ]。 '<br/>' ;
  19. echo '<br/>' ;
  20. }
  21. //サーバーから切断します
  22. $ conn-> close();
  23. } catch (MongoConnectionException $ e){
  24. die( 「MongoDBサーバーへの接続エラー」 );
  25. } catch (MongoException $ e){
  26. die( 'Error:' 。$ e-> getMessage());
  27. }
  28. ?>
*このソースコードは、 ソースコードハイライターで強調表示されました。

このスクリプトの最初に、新しいMongoオブジェクトが初期化され、そのコンストラクターはMongoDBサーバーへの接続を確立するために必要な情報(この例ではホスト名)を渡します。 このオブジェクトは、MongoDBサーバーとの以降のすべての対話に使用されます。
次のステップは、データベースにアクセスすることです。 これは、selectDB()メソッドを使用して実行できます。より簡単には、マジックコールメソッドを使用して、データベースをオブジェクトプロパティとして参照します。 データベースへのアクセスが取得されると、selectCollection()メソッドまたはマジックコールメソッドを使用してコレクションにアクセスし、コレクションをプロパティとして参照することは難しくありません。 コレクションはMongoCollectionオブジェクトとして表示されます。
各MongoCollectionオブジェクトには、クエリの実行に使用できるfind()メソッドがあります。 このメソッドは、引数として2つの配列を取ります。要求パラメーターの配列と、要求への応答の結果として取得されるフィールドの配列です。 戻り値は、MongoCursorオブジェクト型のオブジェクトで表されるカーソルです。 MongoCursor型はIteratorテンプレートを実装しているため、foreach()を使用して返されたセット全体を簡単に実行できます。 MongoCursor型には、レコード数を返すcount()メソッドが含まれています。
PHP拡張機能Mongoは、PHP 5.xで実装された例外モデルをサポートし、5種類の例外を定義します。接続関連エラーのMongoConnectionException、リクエスト関連エラーのMongoCursorExceptionおよびMongoCursorTimeoutException。 ファイル相互作用エラーのMongoGridFSException。 その他すべてのエラーについてはMongoException。 前の例では、try / catchブロックでコードをラップすることをお勧めします。
以下は、前の例のサンプル出力です。


加算と減算
コレクションに新しいドキュメントを追加するのは非常に簡単です。 次の例を参照してください。
<?php
try {
// open connection to MongoDB server
$conn = new Mongo( 'localhost' );

// access database
$db = $conn->test;

// access collection
$collection = $db->items;

// insert a new document
$item = array(
'name' => 'milk' ,
'quantity' => 10,
'price' => 2.50,
'note' => 'skimmed and extra tasty'
);
$collection->insert($item);
echo 'Inserted document with ID: ' . $item[ '_id' ];

// disconnect from server
$conn->close();
} catch (MongoConnectionException $e) {
die( 'Error connecting to MongoDB server' );
} catch (MongoException $e) {
die( 'Error: ' . $e->getMessage());
}
?>

* This source code was highlighted with Source Code Highlighter .

新しいドキュメントをコレクションに追加するには、挿入するキーと値のペアを含む新しい配列を作成し(メカニズムは埋め込みドキュメントに変換されるネストされた配列もサポートします)、この配列をMongoCollection型のオブジェクトのinsertメソッドに渡します。 このメソッドは、ドキュメントをコレクションに追加し、値 '_id'(ドキュメントの一意の識別子)を計算します。これは、元の配列に追加されます。 この識別子は、識別子の16進数表現であるMongoIdの特別なタイプとして表されます。 したがって、追加の要求を行うことなく、ドキュメント識別子を簡単に取得できます。
以下に例を示します。


ドキュメントは、remove()メソッドによってコレクションから削除されます。remove()メソッドは、一連の基準をパラメーターとして受け取り、これらの基準に一致するすべての文書を削除します。 通常、remove()はブール型の値(trueまたはfalse)を返します。 ただし、特別な「安全な」引数を2番目の引数として渡すと、削除されたドキュメントの数など、多くの情報を含む配列が取得されます。 以下に例を示します。
<?php
try {
// open connection to MongoDB server
$conn = new Mongo( 'localhost' );

// access database
$db = $conn->test;

// access collection
$collection = $db->items;

// remove a document
$criteria = array(
'name' => 'milk' ,
);
$r = $collection->remove($criteria, array( 'safe' => true ));
echo 'Removed ' . $r[ 'n' ] . ' document(s).' ;

// disconnect from server
$conn->close();
} catch (MongoConnectionException $e) {
die( 'Error connecting to MongoDB server' );
} catch (MongoException $e) {
die( 'Error: ' . $e->getMessage());
}
?>

* This source code was highlighted with Source Code Highlighter .

識別子を使用してドキュメントを削除することもできます。 ただし、MongoIdメソッドオブジェクトは、PHP文字列ではなく、remove()メソッドに渡されます。 以下に例を示します。
<?php
try {
// open connection to MongoDB server
$conn = new Mongo( 'localhost' );

// access database
$db = $conn->test;

// access collection
$collection = $db->items;

// remove a document by ID
$criteria = array(
'_id' => new MongoId( '4bea96b400f4784c0a070000' ),
);
$collection->remove($criteria);
echo 'Removed document with ID: ' . $criteria[ '_id' ];

// disconnect from server
$conn->close();
} catch (MongoConnectionException $e) {
die( 'Error connecting to MongoDB server' );
} catch (MongoException $e) {
die( 'Error: ' . $e->getMessage());
}
?>

* This source code was highlighted with Source Code Highlighter .

以下に示すように、ドキュメントはsave()メソッドを使用して更新されます。
<?php
try {
// open connection to MongoDB server
$conn = new Mongo( 'localhost' );

// access database
$db = $conn->test;

// access collection
$collection = $db->items;

// retrieve existing document
$criteria = array(
'name' => 'eggs' ,
);
$doc = $collection->findOne($criteria);

// update document with new values
// save back to collection
$doc[ 'name' ] = 'apples' ;
$doc[ 'quantity' ] = 35;
$doc[ 'note' ] = 'green apples taste sooooo good!' ;
$collection->save($doc);

// disconnect from server
$conn->close();
} catch (MongoConnectionException $e) {
die( 'Error connecting to MongoDB server' );
} catch (MongoException $e) {
die( 'Error: ' . $e->getMessage());
}
?>

* This source code was highlighted with Source Code Highlighter .

findOne()が何も返さない場合、save()を呼び出すと新しいドキュメントが追加されることに注意してください。
質問する
クエリの実行に関しては、MongoDBはかなり柔軟なツールキットを提供します。 検索条件に一致する一連のドキュメントを返すfind()メソッドは既に見ました。 単一のドキュメントを返すfindOne()メソッドもあります。 多くの検索条件を使用できます-検索条件としてfind()またはfindOne()に配列を渡すだけで、MongoDBはこれらすべての条件をAND修飾子で適用します。
以下に例を示します。
<?php
try {
// open connection to MongoDB server
$conn = new Mongo( 'localhost' );

// access database
$db = $conn->test;

// access collection
$collection = $db->items;

// formulate AND query
$criteria = array(
'quantity' => 30,
'price' => 0.5
);

// retrieve only 'name' and 'price' keys
$fields = array( 'name' , 'price' );

// execute query
$cursor = $collection->find($criteria, $fields);

// iterate through the result set
// print each document
echo $cursor->count() . ' document(s) found. <br/>' ;
foreach ($cursor as $obj) {
echo 'Name: ' . $obj[ 'name' ] . '<br/>' ;
echo 'Price: ' . $obj[ 'price' ] . '<br/>' ;
echo '<br/>' ;
}

// disconnect from server
$conn->close();
} catch (MongoConnectionException $e) {
die( 'Error connecting to MongoDB server' );
} catch (MongoException $e) {
die( 'Error: ' . $e->getMessage());
}
?>

* This source code was highlighted with Source Code Highlighter .

MongoDBは、複雑なクエリを作成するための多数の条件演算子と論理演算子もサポートしています。 さらに、正規表現のサポート。 以下は、金額が10〜50で、名前が「es」で終わるすべてのレコードを表示する例です。
<?php
try {
// open connection to MongoDB server
$conn = new Mongo( 'localhost' );

// access database
$db = $conn->test;

// access collection
$collection = $db->items;

// formulate complex query
$criteria = array(
'quantity' => array(
'$gt' => 10,
'$lt' => 50
),
'name' => new MongoRegex( '/es$/i' )
);

// execute query
$cursor = $collection->find($criteria);

// iterate through the result set
// print each document
echo $cursor->count() . ' document(s) found. <br/>' ;
foreach ($cursor as $obj) {
echo 'Name: ' . $obj[ 'name' ] . '<br/>' ;
echo 'Quantity: ' . $obj[ 'quantity' ] . '<br/>' ;
echo 'Price: ' . $obj[ 'price' ] . '<br/>' ;
echo '<br/>' ;
}

// disconnect from server
$conn->close();
} catch (MongoConnectionException $e) {
die( 'Error connecting to MongoDB server' );
} catch (MongoException $e) {
die( 'Error: ' . $e->getMessage());
}
?>

* This source code was highlighted with Source Code Highlighter .

どのように見えるか:


また、返されるドキュメントの数を変更したり、limit()およびsort()メソッドを使用して必要なキーでソートしたりすることもできます。 以下に例を示します。
<?php
try {
// open connection to MongoDB server
$conn = new Mongo( 'localhost' );

// access database
$db = $conn->test;

// access collection
$collection = $db->items;

// execute query
// sort by price
// limit to 3 documents
$cursor = $collection->find();
$cursor->sort(array( 'price' => 1))->limit(3);

// iterate through the result set
// print each document
echo $cursor->count() . ' document(s) found. <br/>' ;
foreach ($cursor as $obj) {
echo 'Name: ' . $obj[ 'name' ] . '<br/>' ;
echo 'Quantity: ' . $obj[ 'quantity' ] . '<br/>' ;
echo 'Price: ' . $obj[ 'price' ] . '<br/>' ;
echo '<br/>' ;
}

// disconnect from server
$conn->close();
} catch (MongoConnectionException $e) {
die( 'Error connecting to MongoDB server' );
} catch (MongoException $e) {
die( 'Error: ' . $e->getMessage());
}
?>

* This source code was highlighted with Source Code Highlighter .

ちなみに、MongoDBが内部でクエリを実行する方法を調べる場合、MongoCursorオブジェクトのExplain()メソッドを使用して、MySQL EXPLAINコマンドと非常によく似たクエリ処理システムを「見る」ことができます。 以下は、例と出力結果です。
<?php
try {
// open connection to MongoDB server
$conn = new Mongo( 'localhost' );

// access database
$db = $conn->test;

// access collection
$collection = $db->items;

// execute and explain query
$criteria = array(
'quantity' => array(
'$gt' => 10,
'$lt' => 50
),
'name' => new MongoRegex( '/es$/i' )
);
$cursor = $collection->find($criteria);
$cursor->sort(array( 'price' => 1))->limit(3);
print_r($cursor->explain());

// disconnect from server
$conn->close();
} catch (MongoConnectionException $e) {
die( 'Error connecting to MongoDB server' );
} catch (MongoException $e) {
die( 'Error: ' . $e->getMessage());
}
?>

* This source code was highlighted with Source Code Highlighter .



ランクとファイル
ドキュメントに加えて、MongoDBはバイナリデータもサポートしています。 最大4 MBのバイナリデータは通常のドキュメントに保存でき、このサイズより大きいデータ(ファイル)はGridFSと呼ばれる小さなものを使用して保存できます。
GridFSは、MongoDBで大きなファイルを分割して保存するための仕様です。 通常、GridFSは2つのコレクションを使用します。各ファイルに関するメタデータを収集する「ファイル」コレクションと、チャンクに分割されたデータを保存する「チャンク」コレクションです。 'files'コレクションの各ファイルには、MongoDBに保存されている他のドキュメントの識別子と同様の一意の識別子があります。 この識別子を使用して、ファイルを取得または変更できます。

MongoDB PECL拡張モジュールは、GridFSを使用して保存されたファイルと対話するために使用できるMongoGridFSクラスのセットを提供します。 各ファイルはMongoGridFSFileクラスのインスタンスによって表され、各MongoGridFSオブジェクトはこれらのファイルを追加、削除、検索するためのメソッドを提供します。

よりよく理解するために、MongoDBにイメージを追加するプロセスを示す次の例を検討してください。
<?php
try {
// open connection to MongoDB server
$conn = new Mongo( 'localhost' );

// access database
$db = $conn->test;

// get GridFS files collection
$gridfs = $db->getGridFS();

// store file in collection
$id = $gridfs->storeFile( '/tmp/img_2312.jpg' );
echo 'Saved file with ID: ' . $id;

// disconnect from server
$conn->close();
} catch (MongoConnectionException $e) {
die( 'Error connecting to MongoDB server' );
} catch (MongoException $e) {
die( 'Error: ' . $e->getMessage());
}
?>

* This source code was highlighted with Source Code Highlighter .

例の最初で、MongoDBクラスのgetGridFS()メソッドを使用してMongoGridFSクラスのインスタンスが取得され、storeFile()メソッドがファイルをMongoDBに保存します。 この例を実行してからデータベースの内容を見ると、2つの新しいコレクション「fs.files」と「fs.chunks」が表示されます。 「fs.files」コレクションをもう少し詳しく見ると、追加したファイルが表示されます。
> show collections
fs.chunks
fs.files
items
system.indexes
> db.fs.files.find()
{ "_id" : ObjectId( "4beaa34f00f4784c0a300000" ), "filename" : "/tmp/img_2312.jpg" , "uploadDate" : "Wed May 12 2010 18:17:11 GMT+0530 (India Standard Time)" , "length" : 11618, "chunkSize" : 262144, "md5" : "e66b9a33c7081ae2e4fff4c37f1f756b" }

* This source code was highlighted with Source Code Highlighter .

storeFile()の代わりに、PHPを使用したファイルのダウンロードと組み合わせて使用​​するように設計されたstoreUpload()メソッドがあります。 この機能の使用は非常に簡単です。フォームのファイルアップロードフィールドの名前をstoreUploadに渡すと、MongoDBがすべてを実行します。 ファイル名を2番目の引数として渡すこともできます。
以下に小さな例を示します。
<html>
<head></head>
<body>
<form method= "post" enctype= "multipart/form-data" >
Select file for upload:
<input type= "file" name= "f" />
<input type= "submit" name= "submit" />
</form>
<?php
if (isset($_POST[ 'submit' ])) {
try {
// open connection to MongoDB server
$conn = new Mongo( 'localhost' );

// access database
$db = $conn->test;

// get GridFS files collection
$gridfs = $db->getGridFS();

// check uploaded file
// store uploaded file in collection and display ID
if (is_uploaded_file($_FILES[ 'f' ][ 'tmp_name' ])) {
$id = $gridfs->storeUpload( 'f' );
echo 'Saved file with ID: ' . $id;
} else {
throw new Exception( 'Invalid file upload' );
}

// disconnect from server
$conn->close();
} catch (MongoConnectionException $e) {
die( 'Error connecting to MongoDB server' );
} catch (Exception $e) {
die( 'Error: ' . $e->getMessage());
}
}
?>
</body>
</html>

* This source code was highlighted with Source Code Highlighter .

データベースにファイルがあり、それを取り戻す方法は? もちろん、ドキュメントIDを使用してファイルを取得します(MongoGridFSはMongoCollectionの継承なので、find()およびfindOne())をMongoGridFSFileクラスのオブジェクトとして使用し、write()メソッドを使用してディスクに書き込むか、またはgetBytes()を使用します。 ブラウザーで出力を使用する場合、必要なヘッダーを追加することを忘れないでください!
以下に例を示します。
<?php
try {
// open connection to MongoDB server
$conn = new Mongo( 'localhost' );

// access database
$db = $conn->test;

// get GridFS files collection
$grid = $db->getGridFS();

// retrieve file from collection
$file = $grid->findOne(array( '_id' => new MongoId( '4beaa34f00f4784c0a300000' )));

// send headers and file data
header( 'Content-Type: image/jpeg' );
echo $file->getBytes();
exit;

// disconnect from server
$conn->close();
} catch (MongoConnectionException $e) {
die( 'Error connecting to MongoDB server' );
} catch (MongoException $e) {
die( 'Error: ' . $e->getMessage());
}
?>

* This source code was highlighted with Source Code Highlighter .


男の子とそのおもちゃ
PECL拡張機能MongoDBはMongoDBを操作するための非常に便利な方法を提供しますが、たとえば、MongoDBを既存のアプリケーション(フレームワークベースのアプリケーション)に統合しようとしている場合、より高いレベルの抽象化が必要になる場合があります。 この場合、 Morphを使用できます。これは、GNU GPLの下で無料で利用できる「MongoDBの高レベルライブラリ」です。

Morphは、メインのMorph_Objectクラスを拡張するMongoDBオブジェクトの説明を作成できるActiveRecordテンプレートとして記述されています。 Morph_Objectクラスのこれらのインスタンスは、MongoDBドキュメントに直接反映され、標準のオブジェクト表記を使用して作業するために使用できるものと同じプロパティとメソッドを持っています。

説明のために、おもちゃのデータベースを作成するとします。 一般的な属性には、名前、説明、説明、子供の年齢、性別の適合性、価格が含まれます。 このすべての情報をMorph_Objectクラスのオブジェクトとして表すことができます。
<?php
class Toy extends Morph_Object {

public function __construct($id = null )
{
parent::__construct($id);
$ this ->addProperty( new Morph_Property_String( 'name' ))
->addProperty( new Morph_Property_String( 'colors' ))
->addProperty( new Morph_Property_Integer( 'minAge' ))
->addProperty( new Morph_Property_Integer( 'maxAge' ))
->addProperty( new Morph_Property_Enum( 'gender' , null , array( 'boys' , 'girls' , 'both' )))
->addProperty( new Morph_Property_Float( 'price' ));
}
}
?>

* This source code was highlighted with Source Code Highlighter .

これで、Toyクラスのオブジェクトを使用して、このテンプレートに従って新しいドキュメントを作成し、プロパティを設定して、save()メソッドを使用して作成できます。 以下に例を示します。
<?php
require_once 'Morph.phar' ;

// initialize MongoDB connection
$mongo = new Mongo( 'localhost' );

// select database for storage
$storage = Morph_Storage::init($mongo->selectDb( 'test' ));

// create object and set properties
$toy = new Toy();
$toy->name = 'Ride Along Fire Engine' ;
$toy->colors = 'red,yellow' ;
$toy->minAge = '2' ;
$toy->maxAge = '4' ;
$toy->gender = 'both' ;
$toy->price = 145.99;

// save to database
$storage->save($toy);
echo 'Document saved with ID: ' . $toy->id();
?>

* This source code was highlighted with Source Code Highlighter .

また、オブジェクトを識別子で取得し、更新して保存することもできます。
<?php
require_once 'Morph.phar' ;

// initialize MongoDB connection
$mongo = new Mongo( 'localhost' );

// select database for storage
$storage = Morph_Storage::init($mongo->selectDb( 'test' ));

// create object and set properties
$toy = new Toy();
$toy->loadById( '5421d0b9fc6217c5bb929baa14a97e08' );
$toy->name = 'Jumping Squid' ;
$toy->colors = 'red,orange,green,blue,yellow' ;
$toy->minAge = '2' ;
$toy->maxAge = '10' ;
$toy->gender = 'boys' ;
$toy->price = 22.99;

// save to database
$storage->save($toy);
echo 'Document saved with ID: ' . $toy->id();
?>

* This source code was highlighted with Source Code Highlighter .


これらのすべての例が示すように、MongoDBは、スキーマフリーDBMSの信頼性が高く機能豊富な実装を提供します。 複数のプラットフォーム間でのアクセシビリティ、PHPや他の言語との簡単な統合、豊富なドキュメント(さらに非常にクールなオンライン実験オプション)により、MongoDBは最新のドキュメント指向データベースの開発に最適です。

Source: https://habr.com/ru/post/J103699/


All Articles