タグ別アーカイブ: mongoDB

MongoDBについて(DBを操作する)

前回→MongoDBについて(Windowsへのインストール)

皆さん。こんにちは。
元RDB使いの中野です。

前回MongoDBをインストールしましたので、
DBを実際に操作したいと思います。

1.DBを操作するコマンド

イントロとしては薄い本
http://www.cuspy.org/diary/2012-04-17/the-little-mongodb-book-ja.pdf
詳細は公式のマニュアル
https://docs.mongodb.org/manual/reference/method/
等をご参照ください。

基本的なものを以下に記載します。

今いるデータベースの確認
>db;
データベースの表示
>show dbs;
データベースの切替
>use localdb;
データベースの作成
>use localdb;
>db.createCollection("transactions");
  ※コレクションを作成すると、dbがない場合、作成されます。
データベースの削除
>db.dropDatabase();
コレクションの作成
>db.createCollection("transactions");
コレクションの確認
>show collections;
データの挿入
>db.transactions.insert({"name":"XXXXX"});
データの更新
>db.transactions.update({"name":"XXXXX"}, {$set:{"data":"XXXX"}});

知っていると使えそうなもの

カラムの削除
>db.transactions.update({"_id":XXXX}, $unset:{"colname":1}});
カラムのリネーム
>db.transactions.update({"_id":XXXX}, $rename:{"oldcolname":"newcolname"}});

2.DBRefを使ってみる

mongoDBはNoSQLの一種なので、RDBのようには使えません。
とは言え、マスタとトランザクションのような持ち方をしたい時もあると思います。
その際に、ドキュメント間でリンクを持ち、外部結合のような形で参照できる機構がDBRefです。

実際にやってみましょう。
前提として
・商品(collection : products)
マスタとして、名称(name)、金額(amount)を持ちます
・注文(collection : orders)
トランザクションとして、個数(count)を持ちます
また、商品へのリンクを持ちます。

商品は以下を用意しました。

mongo_site.png

商品へのリンクは、DBRefを使います。
以下のコマンドで、トランザクションを登録します。
>db.orders.insert({"count":20},"ref_id":new DBRef("products",new ObjectId("XXXXXXXXXX"))});
>db.orders.insert({"count":10},"ref_id":new DBRef("products",new ObjectId("XXXXXXXXXX"))});

DBRefは1つ目の引数にcollection名、2つ目の引数に参照元のObjectIdを指定することでリンクを持つことができます。
上記の場合、1つ目はwashing machine 、2つ目はelectric fanを商品に指定したとします。

登録されたordersは以下の様になります。
mongo_site.png
DBRef経由で登録したことで、$refと$idが自動的に登録されていることがわかります。

参照する際は、mongoDBのコマンド(機能)ではなく、
クライアント側のドライバを経由して、参照します。

今回はPHPを使って照会してみます。

前提として、ローカルにPHP及びMongoDBのドライバがセットアップされていることが必要です。
PHPについては、XAMPPを使うと簡単にインストールできます。
https://www.apachefriends.org/download.html
MongoDBのPHPドライバのインストールついては、以下が参考になります。
http://php.net/manual/ja/mongo.installation.php

PHPではMongoDBRefクラスを使って参照します。
getの1つ目の引数にはdb、2つ目の引数にはDBRefを指定します。
用意したPHPのPGMは以下です。
mongo_site.png

実行した結果は以下のようになりました。
mongo_site.png
それぞれ、指定した商品が紐づいているのがわかります。
この機構を使えば、トランザクションからマスタを結合して照会することができるため、
RDB的なイメージでも使えそうですね。