MongoDBとPHP_リンクと個人的ポイントまとめ
2015/04/18
===============================
リンク集
===============================
MongoDBの概要・操作
これを読んどけば、入門はOKってぐらいのもん
- MongoDBドキュメント日本語訳一部完了のお知らせ
developerリファレンス日本語訳。有難い。
インストール、コンソールから操作
CentOSにインストール
MongoDBの基本的なコマンド
PHPから操作
MongoDB を PHP から操作する
フレームワークと使いたいな
FuelPHPを使おうかな。
Cakeを使ってみようかな
その他
SQL脳に優しいMongoDBクエリー入門
こいつも便利だぜ
===============================
ポイント 注意事項
===============================
PHPで操作する場合は、MongoDBコンソールのオブジェクトは連想配列に置き換えて考えるんだ!
MongoDBのUpdateにだまされるな! SQLのupdateとは動きが違うぞ!
詳細は薄い本の第2章を参照のこと。
updateで複数レコードを更新する。
SQLなら条件に該当したレコードが更新されるけど、MongoDBの場合はデフォルトで最初の1件だけ。 オプションで「{ multi: true }」とする必要がある。
#mongoshell
db.news.update({“no”:”1″},{{“name”:”fz6″}}, { multi: true });
upsertを使う場合はオプションに「{ upsert: true }」だ
アップデート対象のキーが無い場合は、insertしてくれるUpsert。
対応しているが、上記のオプションが必要。
1 2 3 4 5 |
<?php $col->update(array('name'=> "名前"), //更新条件 array('name' =>"名前2", 'point' => "100"), // 更新内容 ここではコレクションを丸々入れ替えとなる。 array('upsert'=>true) // upsert ); |
PHPでの$setを使ったupdateがうまくない….
コレクションの一部をかきかえるための$setを下記のように使っても、うまく更新されなかった。
1 2 3 4 |
<?php $col->update(array('_id' => new MongoId($id)), //更新条件 array('$set'=> array( 'point' => "100")) ); |
point項目が100になるとイメージしてたけど。だめ。
しようがないので、丸々書き換えて対応
1 2 3 4 5 6 7 |
<?php $data = $this->col->findOne(array('_id' => new MongoId($id))); //データを取得 $data["point"] =100; //指定IDのデータを丸々上書き $this->col->update(array( '_id' => new MongoId($id)), $data, // ); |
ふー。
コンソールでfindした場合は全件一気に表示されない。itとか入れろって、面倒くせえ。
全件出す場合はこれだ。
db.collection.find().forEach(printjson)
(追加)検索結果の操作(ソートとか、件数指定とか)
http://d.hatena.ne.jp/sasaplus1/20120624/1340525126
// scoreの降順でソート
db.users.find().sort({score: -1});// 2番目のドキュメントから3件だけ表示
db.users.find().skip(2).limit(3);
findの結果からidを取得するのがちょっと特殊。
1 2 3 4 5 6 |
//dateで降順ソート、20件目から50件分取得 $cursor = $col->find()->sort(array("date"=> -1))->skip(20)->limit(50); $arr_id foreach($cursor As $id => $obj ){ //結果要素にアクセス $arr_id[] =array("id" => $obj["_id"]->{'$id'}); } |
IDでfindする。new MongoIdとかしないといけなひ。。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$obj = $col->findOne(array('_id' => new MongoId("MongoDBのオブジェクトID"))); << *** MongoDBのダンプ・リストア方法 ダンプファイルの指定は、出力先ディレクトリを指定するだけ。デフォルトはコマンドを実行したカレントにdumpフォルダが作成されるが、--outで出力先フォルダを指定することが出来る。 http://gihyo.jp/dev/serial/01/mongodb/0011?page=2 *** mongoでアンド検索(複数条件は{}でなく[]で囲む), phpの場合は配列を追加し合えばOK mongo shell >> > db.news.find( {$and:[ {date2:/2014-08-05/i}, {"site":"アピタル"}]},{date2:true}); << php findに渡したいのは下記の配列 >|php| <?php array( '$and' => array( array( 'name' => "example" ), array( 'val'=>"1" ), ) |
作る時は配列に配列を追加する方法で可能。マージでは無い。
1 2 3 4 5 6 |
<?php $arr_opt = array(); $arr_opts[] = array( 'name' => "example" ); $arr_opts[] = array( 'val' => "1" ); $arr_cond= array('$and', $arr_opts) $col->find($arr_cond); |
条件増えてくと、階層増えるからもっとうまいやり方を考えときたい。
日付の扱い
MongoDBで、日付の期間を指定して検索する方法 – DQNEO起業日記
How to return ISO date format in PHP for MongoDB? – Stack Overflow
・Momngo日付オブジェクト-みたいな奴が居て、日付で絞り込みとかするにはその形式にして保存しないとアカン。
で、文字列⇔Mongo日付についてメモ
MongoShellでのやり方
1 2 |
var query= { "timestamp" : { "$gte" : ISODate("2011-11-01T00:00:00+09:00"), "$lte" : ISODate("2011-11-02T00:00:00+09:00") } }; db.userlog.find(query).sort({timestamp:1}); |
PHPでのやり方。
1 2 3 4 5 6 7 8 9 10 11 |
<?php $mongo = new Mongo(); $db = $mongo->selectDB("db名"); $col = $db->selectCollection("collections名"); $cursor = $col->find(); //全件とって... foreach($cursor As $id => $obj ){ // $date = yyyy-mm-dd hh:mm形式⇒Mongo $iso_date = new MongoDate(strtotime($date)); // Mongo ⇒string echo date(DATE_ISO8601,$iso_date->sec); } |
PHPで全件取得して表示
1 2 3 4 5 6 7 8 9 |
<?php //mDB $mongo = new Mongo(); $db = $mongo->selectDB("DB名"); $col = $db->selectCollection("collection名"); $cursor = $col->find(); foreach($cursor As $key => $value ){ print_r($value); } |
sortを使うと結構メモリ容量オーバーする。
1データのサイズが大きいのもあるけど、件数多い場合はsort使うなってことかな。。。。
一応インデックスは張ったんだけどなぁ。
関連記事
-
-
[php]ログインセッションの維持・有効期間について (session,cookie)
cookieとsessionファイルと、登場人物が複数いるので、どこに何を設定す …
-
-
【メモ】simple_html_parserの使い方リンク
[インストール~DOMオブジェクトの取得] http://so-zou.jp/w …
-
-
自然順と辞書順のソートの違い
本ページの内容は下記リンクに集約しました。 http://www. …
-
-
【php】strtotimeで日付計算する場合の基準日の指定のくせ「A non well formed numeric value encountered in 」
またちょっと嵌った。。。 strtotime() 書式化された文字列からunix …
-
-
【PHP】【Slim】インストールー手動ダウンロード と Composer
ずーっと思ってた、CakeとかCodeIgnaitorとか、俺には多機能すぎる! …