Added: phpdoc/ja/trunk/reference/mongo/connecting.xml =================================================================== --- phpdoc/ja/trunk/reference/mongo/connecting.xml (rev 0) +++ phpdoc/ja/trunk/reference/mongo/connecting.xml 2010-08-08 09:46:51 UTC (rev 301981) @@ -0,0 +1,209 @@ + + + + +
+ 接続 + + + MongoDB への接続は単に new Mongo とするだけの簡単なものですが、 + オプションや設定項目が多数あります。 + Mongo::__construct のページにすべての API + オプションをまとめましたが、ここではより実用的な使用例をとりあげます。 + + +
+ 接続時のログイン + + MongoDB を --auth オプションつきで起動すると、 + 接続時の認証が必須となります。データベース単位でこれを設定するには + MongoDB::authenticate を使います。 + + +admin; + +$db->authenticate($username, $password); + +?> +]]> + + + この方法には大きな弱点があります。 + データベースとの接続が切れてしまって自動再接続をしたときには、 + 認証されていない状態になってしまうということです。 + + + Mongo::__construct で説明した接続文字列形式を使えば、 + 接続を再確立したときにも再び認証を行うことができます。 + + + これは上のコードと同じ意味ですが、 + 再接続したときにも自動的に認証を行います。 + + + +]]> + + + デフォルトでは、ユーザの認証は admin データベースに対して行います。 + 別のデータベースへの認証を行うには、ホスト名のあとにデータベース名を指定します。 + この例は、"blog" データベースにログインします。 + + + +]]> + +
+ +
+ レプリカペア + + レプリカペアに接続するには、ペアの両方を指定します。 + + + +]]> + + + 順番を気にする必要はありません。PHP ドライバは、 + どちらがマスタかをサーバに問い合わせて判断します。 + どちらか一方が立ち上がっていてそれがマスタであれば、接続は成功します。 + 両方とも立ち上がっていなかったりマスタがなかったりした場合は + MongoConnectionException がスローされます。 + + + マスタが使えなくなったときに、スレーブがマスタになるには数秒かかります。 + その間は、ドライバからは一切のデータベース操作ができなくなります。 + マスタデータベースがなく、使えるデータベースがスレーブだけだからです。 + したがって、このときに何らかの問い合わせ ("安全な" 操作を含む) + をすると例外が発生します。 + + + マスタが使えなくなったということをスレーブが認識すると、 + 自分自身をマスタに昇格させます。その後は、 + ドライバがデータベース接続を切り替えて通常の操作を続行できるようになります。 + + + レプリカペアについての詳細は、 + コアドキュメント + を参照ください。 + +
+ +
+ 持続的接続 + + + データベースへの接続を新たに確立させるには、非常に時間がかかります。 + データベースへ接続の作成回数を最小限にするには、持続的接続を使うことができます。 + 持続的接続は PHP が保持するので、同じ接続を使って複数のリクエストを送ることができます。 + + + + たとえば、この単純なプログラムはデータベースに 1000 回接続します。 + + + + +]]> + + + + 実行時間は約 18 秒です。これを、持続的接続を使うように変更してみましょう。 + + + + "x")); +} + +?> +]]> + + + + 実行時間は .02 秒未満になりました。データベースへの接続は 1 回だけしか行わないからです。 + + + + 持続的接続には識別用の文字列 (上の例では "x") + が必要で、これを使って接続を識別します。 + 持続的接続を使うには、ホスト名とポート、持続文字列、そしてユーザ名とパスワード(指定した場合) + が既存の持続的接続と一致しなければなりません。 + 一致しない場合は、この識別情報で新しい接続を作成します。 + +
+ +
+ ドメインソケット + + + MongoDB をローカルで動かしていてバージョン 1.0.9 + 以降のドライバを使っている場合は、ファイル経由でデータベースに接続することができます。 + MongoDB は、起動時に自動的にソケットファイル + /tmp/mongodb-<port>.sock + (Windows の場合は C:\tmp\mongodb-<27017>.sock) をオープンします。 + + + + ソケットファイルに接続するには、このパスを MongoDB 接続文字列に指定します。 + + + + +]]> + + + + 上で示したようなソケットファイルへの接続で認証を使いたい場合は、 + ポート番号 0 を指定しなければなりません。 + 接続文字列のパーサは、これを接続文字列の終端と見なします。 + + + + +]]> + + +
+ +
Property changes on: phpdoc/ja/trunk/reference/mongo/connecting.xml ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Date LastChangedDate LastChangedRevision Author LastChangedBy HeadURL URL Added: phpdoc/ja/trunk/reference/mongo/core.xml =================================================================== --- phpdoc/ja/trunk/reference/mongo/core.xml (rev 0) +++ phpdoc/ja/trunk/reference/mongo/core.xml 2010-08-08 09:46:51 UTC (rev 301981) @@ -0,0 +1,19 @@ + + + + + + + コアクラス群 + + + これらのクラスは、ドライバの最も重要な部分です。 + + + + &reference.mongo.mongo; + &reference.mongo.mongodb; + &reference.mongo.mongocollection; + &reference.mongo.mongocursor; + + Property changes on: phpdoc/ja/trunk/reference/mongo/core.xml ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Date LastChangedDate LastChangedRevision Author LastChangedBy HeadURL URL Added: phpdoc/ja/trunk/reference/mongo/exceptions.xml =================================================================== --- phpdoc/ja/trunk/reference/mongo/exceptions.xml (rev 0) +++ phpdoc/ja/trunk/reference/mongo/exceptions.xml 2010-08-08 09:46:51 UTC (rev 301981) @@ -0,0 +1,15 @@ + + + + + + + 例外 + + &reference.mongo.mongoexception; + &reference.mongo.mongocursorexception; + &reference.mongo.mongocursortimeoutexception; + &reference.mongo.mongoconnectionexception; + &reference.mongo.mongogridfsexception; + + Property changes on: phpdoc/ja/trunk/reference/mongo/exceptions.xml ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Date LastChangedDate LastChangedRevision Author LastChangedBy HeadURL URL Added: phpdoc/ja/trunk/reference/mongo/functions.xml =================================================================== --- phpdoc/ja/trunk/reference/mongo/functions.xml (rev 0) +++ phpdoc/ja/trunk/reference/mongo/functions.xml 2010-08-08 09:46:51 UTC (rev 301981) @@ -0,0 +1,11 @@ + + + + + + + 関数 + + &reference.mongo.reference; + + Property changes on: phpdoc/ja/trunk/reference/mongo/functions.xml ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Date LastChangedDate LastChangedRevision Author LastChangedBy HeadURL URL Added: phpdoc/ja/trunk/reference/mongo/gridfs.xml =================================================================== --- phpdoc/ja/trunk/reference/mongo/gridfs.xml (rev 0) +++ phpdoc/ja/trunk/reference/mongo/gridfs.xml 2010-08-08 09:46:51 UTC (rev 301981) @@ -0,0 +1,13 @@ + + + + + + + GridFS クラス群 + + &reference.mongo.mongogridfs; + &reference.mongo.mongogridfsfile; + &reference.mongo.mongogridfscursor; + + Property changes on: phpdoc/ja/trunk/reference/mongo/gridfs.xml ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Date LastChangedDate LastChangedRevision Author LastChangedBy HeadURL URL Added: phpdoc/ja/trunk/reference/mongo/manual.xml =================================================================== --- phpdoc/ja/trunk/reference/mongo/manual.xml (rev 0) +++ phpdoc/ja/trunk/reference/mongo/manual.xml 2010-08-08 09:46:51 UTC (rev 301981) @@ -0,0 +1,50 @@ + + + + + + マニュアル + + &reference.mongo.configure; + &reference.mongo.ini; + &reference.mongo.tutorial; + &reference.mongo.connecting; + &reference.mongo.queries; + &reference.mongo.updates; + &reference.mongo.security; + &reference.mongo.testing; + &reference.mongo.trouble; + +
+ &reftitle.seealso; + + Developing Scalable PHP Applications Using MongoDB + は、MongoDB の入門用のすばらしい記事です。フランス語がわかる人なら、 + NoSQL - MongoDB et PHP: Première Approche + もよくまとまっています。 + +
+ +
+ + + Property changes on: phpdoc/ja/trunk/reference/mongo/manual.xml ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Date LastChangedDate LastChangedRevision Author LastChangedBy HeadURL URL Added: phpdoc/ja/trunk/reference/mongo/mongocursortimeoutexception.xml =================================================================== --- phpdoc/ja/trunk/reference/mongo/mongocursortimeoutexception.xml (rev 0) +++ phpdoc/ja/trunk/reference/mongo/mongocursortimeoutexception.xml 2010-08-08 09:46:51 UTC (rev 301981) @@ -0,0 +1,67 @@ + + + + + + + MongoCursorTimeoutException クラス + MongoCursorTimeoutException + + + + +
+ &reftitle.intro; + + クエリのタイムアウトで発生します。 + 今のところ、データベースからのクエリの応答を無制限に待ち続けないようになるのは + MongoCursor::timeout をカーソル上でコールしたときだけです。 + +
+ + +
+ &reftitle.classsynopsis; + + + + MongoCursorTimeoutException + + + + + extends + MongoCursorException + + + + + + + +
+ +
+ +
+ + Property changes on: phpdoc/ja/trunk/reference/mongo/mongocursortimeoutexception.xml ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Date LastChangedDate LastChangedRevision Author LastChangedBy HeadURL URL Added: phpdoc/ja/trunk/reference/mongo/mongomaxkey.xml =================================================================== --- phpdoc/ja/trunk/reference/mongo/mongomaxkey.xml (rev 0) +++ phpdoc/ja/trunk/reference/mongo/mongomaxkey.xml 2010-08-08 09:46:51 UTC (rev 301981) @@ -0,0 +1,91 @@ + + + + + + + MongoMaxKey クラス + MongoMaxKey + + + + +
+ &reftitle.intro; + + MongoMaxKey はデータベースが使う特別な型で、 + 他のどんな型よりも大きいと評価されます。したがって、 + 特定のフィールドの昇順でクエリを並べ替えると、値が + MongoMaxKey であるドキュメントが最後となります。 + + + MongoMaxKey にはフィールドやメソッド、定数はありません。 + データベースに追加するときに使う、単なる "いちばん大きい" ものです。 + +
+ + +
+ &reftitle.classsynopsis; + + + + MongoMaxKey + + + + + MongoMaxKey + + + + + + +
+ +
+ <classname>MongoMaxKey</classname> の使用例 + +insert(array("task" => "dishes", "do by" => new MongoMaxKey)); +$collection->insert(array("task" => "staff meeting", "do by" => new MongoDate(strtotime("+4 days")))); + +$cursor = $collection->find()->sort(array("do by" => 1)); + +?> +]]> + + + このカーソルの中身は、まずstaff meetingドキュメント、次にdishesドキュメントとなります。 + dishesドキュメントは、今後コレクションに何が追加されたとしても必ず最後になります + ("do by" フィールドが + MongoMaxKey である別のドキュメントが追加されない限りは)。 + +
+
+ +
+ + Property changes on: phpdoc/ja/trunk/reference/mongo/mongomaxkey.xml ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Date LastChangedDate LastChangedRevision Author LastChangedBy HeadURL URL Added: phpdoc/ja/trunk/reference/mongo/mongominkey.xml =================================================================== --- phpdoc/ja/trunk/reference/mongo/mongominkey.xml (rev 0) +++ phpdoc/ja/trunk/reference/mongo/mongominkey.xml 2010-08-08 09:46:51 UTC (rev 301981) @@ -0,0 +1,91 @@ + + + + + + + MongoMinKey クラス + MongoMinKey + + + + +
+ &reftitle.intro; + + MongoMinKey はデータベースが使う特別な型で、 + 他のどんな型よりも小さいと評価されます。したがって、 + 特定のフィールドの昇順でクエリを並べ替えると、値が + MongoMinKey であるドキュメントが最初となります。 + + + MongoMinKey にはフィールドやメソッド、定数はありません。 + データベースに追加するときに使う、単なる "いちばん小さい" ものです。 + +
+ + +
+ &reftitle.classsynopsis; + + + + MongoMinKey + + + + + MongoMinKey + + + + + + +
+ +
+ <classname>MongoMinKey</classname> の使用例 + +insert(array("task" => "lunch", "do by" => new MongoMinKey)); +$collection->insert(array("task" => "staff meeting", "do by" => new MongoDate(strtotime("+4 days")))); + +$cursor = $collection->find()->sort(array("do by" => 1)); + +?> +]]> + + + このカーソルの中身は、まずlunchドキュメント、次にstaff meetingドキュメントとなります。 + lunchドキュメントは、今後コレクションに何が追加されたとしても必ず最初になります + ("do by" フィールドが + MongoMinKey である別のドキュメントが追加されない限りは)。 + +
+
+ +
+ + Property changes on: phpdoc/ja/trunk/reference/mongo/mongominkey.xml ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Date LastChangedDate LastChangedRevision Author LastChangedBy HeadURL URL Added: phpdoc/ja/trunk/reference/mongo/mongotimestamp.xml =================================================================== --- phpdoc/ja/trunk/reference/mongo/mongotimestamp.xml (rev 0) +++ phpdoc/ja/trunk/reference/mongo/mongotimestamp.xml 2010-08-08 09:46:51 UTC (rev 301981) @@ -0,0 +1,100 @@ + + + + + + + MongoTimestamp クラス + MongoTimestamp + + + + +
+ &reftitle.intro; + + MongoTimestamp は、シャーディングで使います。 + シャーディングツールに書き込むつもりがないのなら、 + MongoDate を使うとよいでしょう。 + + + MongoTimestamp は、タイムスタンプ + (エポックからの経過秒数) 4 バイトと増分 4 で構成されています。 + + + + このクラスは、時間を計測したりドキュメントにタイムスタンプを追加したり + ドキュメント上のタイムスタンプを自動的に更新したりするためのものではありません。 + + シャーディングにかかわる書き込みをしているのでなければ、さっさと + MongoDate のほうに行きましょう。 + このクラスはあなたの求めているものではありません。 + + + シャーディングツールに書き込んでいるという場合は、このまま読み続けてください。 + +
+ + +
+ &reftitle.classsynopsis; + + + + MongoTimestamp + + + + + MongoTimestamp + + + + + Fields + + public + int + sec + 0 + + + public + int + inc + 0 + + + &Methods; + + + + + +
+
+ + &reference.mongo.entities.mongotimestamp; + +
+ + Property changes on: phpdoc/ja/trunk/reference/mongo/mongotimestamp.xml ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Date LastChangedDate LastChangedRevision Author LastChangedBy HeadURL URL Added: phpdoc/ja/trunk/reference/mongo/queries.xml =================================================================== --- phpdoc/ja/trunk/reference/mongo/queries.xml (rev 0) +++ phpdoc/ja/trunk/reference/mongo/queries.xml 2010-08-08 09:46:51 UTC (rev 301981) @@ -0,0 +1,196 @@ + + + +
+ 問い合わせ + +
+ _id による問い合わせ + + 追加されたすべてのオブジェクトには、一意な _id フィールドが自動的に付加されます。 + これは、問い合わせで使うフィールドとして便利です。 + + + 今追加したばかりのドキュメントを探すことを考えてみましょう。 + 追加するとドキュメントに _id フィールドができるので、それを問い合わせればいいのです。 + + + "joe"); + +$people->insert($person); + +// $joe には _id フィールドがあります +$joe = $people->findOne(array("_id" => $person['_id'])); + +?> +]]> + + + + ユーザが別途指定しない限り、_id フィールドは + MongoId となります。ありがちな間違いは、 + 文字列を MongoId とマッチさせようとすることです。 + 文字列とは別の型であり、そのままではマッチしないことを覚えておきましょう。 + これは、文字列 "array()" と空の配列が別のものであるというのと同じことです。 + 次の例を参照ください。 + + + "joe"); + +$people->insert($person); + +// _id を文字列に変換します +$pid = $person['_id'] . ""; + +// 失敗 - $pid は文字列であり、MongoId ではありません +$joe = $people->findOne(array("_id" => $pid)); + +?> +]]> + + +
+ +
+ 配列 + + + 配列には特殊な点がいくつかあります。 + まず、MongoDB が扱う配列には二種類あります。 + "普通の" 配列と連想配列です。連想配列には、任意の型のキーと値を組み合わせることができます。 + "普通の" 配列は、0 から始まってひとつずつ増えていく数値のインデックスに + それぞれ要素を関連づけます。 + これらは、ほぼ PHP の配列や連想配列と同じようなものです。 + + + + たとえば、受賞の一覧をドキュメントに保存するときには次のようにできます。 + + + +save(array("awards" => array("gold", "silver", "bronze"))); + +?> +]]> + + + + 問い合わせでは、配列の要素も探すことができます。 + 指定した値が配列の要素に含まれるすべてのドキュメントを探すことを考えましょう。 + たとえば、受賞 (awards) に金賞 (gold) が含まれる次のようなドキュメントです。 + + + + + + + + これは、単純なクエリで問い合わせることができます。"awards" + が配列であるということを気にせず、次のようにすればいいのです。 + + + +find(array("awards" => "gold")); + +?> +]]> + + + + もう少し複雑なオブジェクトを考えてみましょう。 + 配列の各要素のオブジェクトになっている、次のような例だとどうでしょう。 + + + + + + + + このような場合でも、配列であることを特別視する必要はありません。 + 内部のオブジェクトへの問い合わせには、ドット記法が使えます。 + + + +find(array("awards.first place" => "gold")); + +?> +]]> + + + + フィールド名にスペースが含まれていてもかまわないことに注目しましょう + (スペースを使わないにこしたことはありませんが、可読性を考慮しました)。 + + + + 配列を使って、取り得る値を複数指定した問い合わせを行うこともできます。 + "gold" あるいは "copper" を含むドキュメントを探すには、このようにします。 + + + +find(array("awards" => array('$in' => array("gold", "copper")))); + +?> +]]> + + +
+
+ + + Property changes on: phpdoc/ja/trunk/reference/mongo/queries.xml ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Date LastChangedDate LastChangedRevision Author LastChangedBy HeadURL URL Added: phpdoc/ja/trunk/reference/mongo/security.xml =================================================================== --- phpdoc/ja/trunk/reference/mongo/security.xml (rev 0) +++ phpdoc/ja/trunk/reference/mongo/security.xml 2010-08-08 09:46:51 UTC (rev 301981) @@ -0,0 +1,66 @@ + + + + +
+ セキュリティ + +
+ リクエストインジェクション攻撃 + + クエリに $_GET パラメータを渡している場合は、 + まず最初にそれを文字列にキャストすることを忘れないようにしましょう。 + GET リクエストには連想配列を入れることもでき、 + そのまま使うと期待通りのクエリにはなりません。 + + + + 当たり障りのない例を示します。ユーザの情報を調べるときに + http://www.example.com?username=bob + のようなリクエストを送っているとしましょう。アプリケーション側では + $collection->find(array("username" => $_GET['username'])) + のような問い合わせをします。 + + + + ここで、誰かが + http://www.example.com?password[$ne]=foo + のようなリクエストを送ったとします。PHP はこれを自動的に連想配列に変換するので、クエリは + $collection->find(array("username" => array('$ne' => "foo"))) + のようになります。これは、名前が "foo" ではないユーザすべて (おそらく全員でしょうね) + の情報を返すことになります。 + + + + この攻撃を防ぐのはきわめて簡単です。$_GET パラメータが期待通りの型であることを確かめてから + データベースにリクエストを送ればよいのです (この場合は、文字列にキャストすることになります)。 + + + + Phil の指摘に感謝します。 + +
+ +
+ + + Property changes on: phpdoc/ja/trunk/reference/mongo/security.xml ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Date LastChangedDate LastChangedRevision Author LastChangedBy HeadURL URL Added: phpdoc/ja/trunk/reference/mongo/testing.xml =================================================================== --- phpdoc/ja/trunk/reference/mongo/testing.xml (rev 0) +++ phpdoc/ja/trunk/reference/mongo/testing.xml 2010-08-08 09:46:51 UTC (rev 301981) @@ -0,0 +1,41 @@ + + + + +
+ ドライバのテストの実行 + + + PECL パッケージには PHP のテストが含まれていませんが、 + Github で公開しています。 + ドライバのソースをダウンロードすると、tests/ ディレクトリ内にテストがあります。 + ドライバのテストには PHPUnit + を使っており、これは PEAR でインストールすることができます。 + + + すべてのテストを成功させるには、php.ini の error_reporting + を E_STRICT | E_ALL に設定しなければなりません。 + そうしないと、発生するはずの警告やエラーが出ないせいでいくつかのテストが失敗します。 + + + テストを実行する際には、MongoDB サーバをローカルのポート 27017 で動かしておきましょう。 + Github からダウンロードしたソースのメインディレクトリで、次のコマンドを実行します。 + + + + + + テストに失敗したりエラーが発生したりした場合は、 + バグトラッカーへのレポートをお願いします。 + いくつかのテストがスキップされることがありますが、 + これは通常の動作であり無視してもかまいません。 + + + 新しいテストの提供も歓迎します! + 型のテスト、機能のテストなど、新しいテストの提供を楽しみにしています。 + +
Property changes on: phpdoc/ja/trunk/reference/mongo/testing.xml ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Date LastChangedDate LastChangedRevision Author LastChangedBy HeadURL URL Added: phpdoc/ja/trunk/reference/mongo/trouble.xml =================================================================== --- phpdoc/ja/trunk/reference/mongo/trouble.xml (rev 0) +++ phpdoc/ja/trunk/reference/mongo/trouble.xml 2010-08-08 09:46:51 UTC (rev 301981) @@ -0,0 +1,82 @@ + + + + +
+ トラブルシューティング + + + 何か問題が発生した場合は、これらが参考になるでしょう。 + + + + + IRC + + MongoDB の公式 IRC ルームは irc.freenode.net/#mongodb + です。ここが、一番すばやく反応が得られるところでしょう… + 人がいれば。 + + + + メーリングリスト + + MongoDB のメーリングリスト + に質問すれば、(通常はとても早く反応があり) よい答えが得られるでしょう。 + + + + バグトラッカー + + バグを見つけた? 機能を追加して欲しい? 疑問がある? + PHP ドライバ用のバグトラッカー + にそれを登録してください。 + + + + + + 詳細なデバッグ出力を有効にするには、ドライバのコンパイル時にデバッグ用のフラグを指定します。 + + + + + + DEBUG は、すべてのデバッグ機能を有効にします。 + すべてではなく、特定のデバッグフラグだけを指定することもできます。 + 最新のコードで使えるフラグは次のとおりです。 + + + DEBUG_CONN + + 接続のデバッグ。 + + + + + +
+ + + Property changes on: phpdoc/ja/trunk/reference/mongo/trouble.xml ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Date LastChangedDate LastChangedRevision Author LastChangedBy HeadURL URL Added: phpdoc/ja/trunk/reference/mongo/tutorial.xml =================================================================== --- phpdoc/ja/trunk/reference/mongo/tutorial.xml (rev 0) +++ phpdoc/ja/trunk/reference/mongo/tutorial.xml 2010-08-08 09:46:51 UTC (rev 301981) @@ -0,0 +1,461 @@ + + + + +
+ チュートリアル +
+ 接続の作成 + + データベースサーバに接続するには、次のいずれかの方法を使います。 + + + +]]> + + + これで、$connection を使ってデータベースを取得できるようになります。 + +
+ +
+ データベースの取得 + + データベースを選択するには次のようにします。 + + +dbname; + +?> +]]> + + データベースを事前に作っておく必要はありません。 + 存在しないデータベースを選択すれば、新しいデータベースを作ることができます。 + Typo には注意しましょう! 意図せずに新しいデータベースを作ってしまい、 + エラーで悩まされる原因になります。 + + +mybiglongdbname; +// 何かをします +$db = $connection->mybiglongdbnme; +// これは別のデータベースに接続してしまいます! + +?> +]]> + + +
+ +
+ コレクションの取得 + + コレクションの取得は、データベースの取得と同じ構文で行えます。 + + +baz; +$collection = $db->foobar; + +// あるいは、もうすこし簡潔に +$collection = $connection->baz->foobar; + +?> +]]> + + +
+ +
+ ドキュメントの追加 + + 連想配列は、データベース内のコレクションに保存できる基本的なオブジェクトです。 + 何らかの "ドキュメント" はこのような形式になります。 + + + "MongoDB", + "type" => "database", + "count" => 1, + "info" => (object)array( "x" => 203, + "y" => 102), + "versions" => array("0.9.7", "0.9.8", "0.9.9") +); + +?> +]]> + + + 配列やオブジェクトをネストできることに注目しましょう。 + MongoDB において、オブジェクトとドキュメントはほぼ同じ意味になります。 + $doc のことをドキュメントと言ってもかまいませんしオブジェクトと呼んでもかまいません。 + しかし、"info" フィールドは常にオブジェクトでドキュメントではありません。 + この決まりは、すべてのドキュメントについて適用されます。 + + + ドキュメントを追加するには MongoCollection::insert を使います。 + + +foo->bar; +$collection->insert( $doc ); + +?> +]]> + + +
+ +
+ + <function>MongoCollection::findOne</function> によるドキュメントの検索 + + + 追加したドキュメントがそこにあることを表示して確かめるには、 + findOne() を使ってコレクション内の最初のドキュメントを取得します。 + このメソッドは単一のドキュメントを返します (一方、 + MongoCollection::find は + MongoCursor を返します)。 + クエリにマッチするドキュメントがひとつしかない場合や + ひとつの結果だけを知りたい場合に便利です。 + + +findOne(); +var_dump( $obj ); + +?> +]]> + + + 結果は、このようになります。 + + + + object(MongoId)#6 (0) { + } + ["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 フィールドが自動的にドキュメントに追加されたことに注目しましょう。 + MongoDB は、_ と $ で始まる要素名を + 内部的な動作のために予約しています。 + +
+ +
+ 複数のドキュメントの追加 + + もう少し意味のある問い合わせをするために、複数のシンプルなドキュメントをコレクションに追加しましょう。 + これから追加するドキュメントは次のようなものです。 + + + value ); + +?> +]]> + + + 効率的に、ループで処理します。 + + +insert( array( "i" => $i ) ); +} + +?> +]]> + + + + + 先ほどと同じコレクションに、別のキーを持つ配列を追加していることに注目しましょう。 + MongoDB が「スキーマフリー」であると言われるのは、こういう側面があるからです。 + +
+ +
+ コレクション内のドキュメント数 + + これで 101 件のドキュメントを追加したことになります + (先ほどのループで 100 件、そして最初の 1 件)。 + 本当にそうなっているか、count() メソッドで確認してみましょう。 + +count(); + +?> +]]> + + 結果は 101 と表示されます。 + + + MongoCollection::count + には、クエリとフィールドを渡すこともできます。また、 + MongoCursor (以下を参照) の数を数えることもできます。 + この場合、クエリで指定したフィルタを考慮して数えます。 + +
+ +
+ カーソルを使った全ドキュメントの取得 + + コレクション内のすべてのドキュメントを取得するには + MongoCollection::find を使います。 + find() メソッドは MongoCursor オブジェクトを返し、 + これを使うとクエリにマッチしたドキュメントすべてに対する反復処理ができるようになります。 + では、すべてのドキュメントを取得して表示させてみましょう。 + + +find(); +foreach ($cursor as $id => $value) { + echo "$id: "; + var_dump( $value ); +} + +?> +]]> + + + これは、コレクション内の全 101 ドキュメントを表示します。 + $id はドキュメントの _id フィールドで、 + $value はドキュメントそのものです。 + +
+ +
+ 問い合わせの条件の設定 + + クエリを作って find() メソッドに渡せば、 + コレクション内のドキュメントのサブセットを取得することができます。 + たとえば、"i" フィールドの値が 71 であるドキュメントを探したいときは、 + このようにします。 + + + 71 ); +$cursor = $collection->find( $query ); + +while( $cursor->hasNext() ) { + var_dump( $cursor->getNext() ); +} + +?> +]]> + + + そうすると、ひとつのドキュメントだけが表示されます。 + + + + object(MongoId)#6 (0) { + } + ["i"]=> + int(71) + ["_ns"]=> + "testCollection" +} +]]> + + +
+ +
+ クエリによる複数ドキュメントの取得 + + クエリを使って、コレクションからドキュメントのセットを取得することができます。 + たとえば、"i" > 50 であるすべてのドキュメントを取得したい場合は次のようにします。 + + + array( '$gt' => 50 ) ); // '$gt' と、シングルクォートで囲んでいることに注意しましょう +$cursor = $coll->find( $query ); + +while( $cursor->hasNext() ) { + var_dump( $cursor->getNext() ); +} + +?> +]]> + + + これは、i > 50 であるドキュメントをすべて表示します。 + また、20 < i <= 30 のような範囲を指定することもできます。 + + + array( "\$gt" => 20, "\$lte" => 30 ) ); +$cursor = $coll->find( $query ); + +while( $cursor->hasNext() ) { + var_dump( $cursor->getNext() ); +} + +?> +]]> + + + "$" をエスケープするのをつい忘れてしまいがちになるときは、 + '$' 以外の文字を特殊文字として使うようにすることもできます。 + キーの中にはあらわれないような特殊文字、たとえば ":" + をひとつ選び、php.ini に次の行を追加します。 + + + + + + すると、先ほどの例を次のように書けるようになります。 + + + array( ":gt" => 20, ":lte" => 30 ) ); + +?> +]]> + + + これは、コードの中でも ini_set("mongo.cmd", ":") のように変更することができます。 + もちろん、単に $ を使うときはシングルクォートで囲むようにするだけでもかまいません。 + +
+ +
+ インデックスの作成 + + MongoDB はインデックスをサポートしています。コレクションにインデックスを追加するのは簡単です。 + インデックスを作るには、対象となるフィールドと並び順を指定します。 + 並び順は、昇順 (1) あるいは降順 (-1) のいずれかです。 + この例では、"i" フィールドの昇順でインデックスを作成しています。 + + +ensureIndex( array( "i" => 1 ) ); // "i" にインデックスを作ります +$coll->ensureIndex( array( "i" => -1, "j" => 1 ) ); // "i" の降順、"j" の昇順でインデックスを作ります + +?> +]]> + + +
+
+ 簡単な例 + + この例では、MongoDB への接続からオブジェクトの追加、 + オブジェクトの問い合わせ、その結果の反復処理、そして接続の切断までを行っています。 + + +comedy; +$collection = $db->cartoons; + +// 要素の追加 +$obj = array( "title" => "Calvin and Hobbes", "author" => "Bill Watterson" ); +$collection->insert($obj); + +// 構造が違う別の要素の追加 +$obj = array( "title" => "XKCD", "online" => true ); +$collection->insert($obj); + +// コレクション内のすべての内容の検索 +$cursor = $collection->find(); + +// 結果の反復処理 +foreach ($cursor as $obj) { + echo $obj["title"] . "\n"; +} + +// 切断 +$m->close(); + +?> +]]> + + + 結果は次のようになります。 + + + + +
+
Property changes on: phpdoc/ja/trunk/reference/mongo/tutorial.xml ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Date LastChangedDate LastChangedRevision Author LastChangedBy HeadURL URL Added: phpdoc/ja/trunk/reference/mongo/updates.xml =================================================================== --- phpdoc/ja/trunk/reference/mongo/updates.xml (rev 0) +++ phpdoc/ja/trunk/reference/mongo/updates.xml 2010-08-08 09:46:51 UTC (rev 301981) @@ -0,0 +1,100 @@ + + + + +
+ 更新 + + + 更新は、MongoDB でできる操作の中でも最も複雑なもののひとつです。 + これは、クエリの実行とその条件にマッチしたドキュメントへの操作を組み合わせたものです。 + 更新操作はきわめて強力なものでもあり、 + ドキュメントの内容を手早く変更したり置き換えたりすることができます。 + また、(可能なら) その場で、少ないオーバーヘッドで実行することができます。 + + +
+ ネストしたオブジェクトの更新 + + + 次のドキュメントで、コメントの作者名を変更したいとします。 + + + + + + 内部のフィールドを変更するには、$set を使って + (その他のフィールドを削除してしまわないように) + 変更したいコメントのインデックスを指定します。 + + +update($criteria, array('$set' => array("comments.1" => array("author" => "Jim")))); + +?> +]]> + + +
+ +
+ 位置演算子 + + 位置演算子 $ は、配列内のオブジェクトを更新するときに便利です。 + 上の例で、変更したいコメントのインデックスがわからず + 単に "John" を "Jim" に変更したいといった場合を考えましょう。 + そのためには $ を使います。 + + +update( + array("comments.author" => "John"), + array('$set' => array('comments.$.author' => "Jim"))); + +?> +]]> + +
+
+ + + Property changes on: phpdoc/ja/trunk/reference/mongo/updates.xml ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Date LastChangedDate LastChangedRevision Author LastChangedBy HeadURL URL