ごった煮

色々な事を書いてます

C#とMongoDBを連携してみる

最近流行ってますよねNoSQL. ということで, NoSQLなDBであるMongoDBとC#を連携する方法を簡単にまとめてみようかと思います.

MongoDBのインストール

  1. ここからMongoDB本体を入手しましょう
  2. 適当な場所にダウンロードしたファイルを解凍して配置します.
  3. 適当な場所にdata, logsフォルダを作成
  4. mongodb.exeをコマンドプロンプトから起動します.(オプションに --dbpath=dataのパス)

これで, ポート番号27017(デフォルトポート)をリッスンしているMongoDBサーバが立ち上がります.

  1. 別のコマンドプロンプトでmongo.exeを起動

この際に, exception: connect failed のように表示されなければMongoDBの起動に成功です.

プログラムとつなぐ準備

大概DBをプログラムから触る場合プロバイダが必要ですが, MongoDBも例に漏れず必要です. NuGetからちゃちゃっと入手しましょう.

"Official MongoDB C# driver"

というプロバイダが出てくるのでインストールしましょう.

これで準備完了です.

MongoDBの扱い方

MongoDBを操作する場合, 通常のRDBに比較的近いように操作できます. 動作としては,

  1. MongoDBサーバと接続
  2. データベースに接続
  3. コレクションを取得

という流れになります. ここでいうコレクションとは, RDBでいうところのテーブルのようなものだと思ってください.

この動作をプログラムで示します. [csharp] var client = new MongoClient();//データベースサーバに接続 var db = client.GetServer().GetDatabase(value);//dbの接続(ないと自動生成) var collection = db.GetCollection("values");//コレクションを取得 [/csharp]

ここでいうvalueは, データベース名, valuesは, その中に配置されているコレクション名を示します. データベースは, 存在しない場合は,自動生成してくれるようです.

MongoClient()の引数に, サーバの接続文字列を渡すとそれに対応したサーバに接続されるようになります.(今回は, ローカルに配置した初期設定のサーバなのでこれで大丈夫)

また, 今回説明に使用するデータモデルを以下に示します.

[csharp] public class Value { [BsonId] public ObjectId _id { get; set; } public string text { get; set; } } [/csharp]

BsonIdは, MongoDBに新しい要素を挿入する際に自動的に生成される一意のIdです.

データを挿入してみる

まずは, データが入っていないと意味がないのでデータをInsertしてみましょう.

一番簡単な方法としては, BsonDocumentを生成してInsertする方法です.

[csharp] var bsonDocument = new BsonDocument { { "text", "hogehogehogeho" } }; collections.Insert(bsonDocument); [/csharp]

これで最初に指定したコレクションにデータが挿入されます.

データを引き出してみる

MongoDBの中身を検索する場合は, C#Linqを使う場合と, MongoDBの方で用意されているものを使用する2パターンが存在します.

Linqの場合

[csharp] var q = from t in collections.AsQueryable() select t; foreach (var item in q) { values.Add(item); } [/csharp]

Linqじゃない場合

[csharp] var result = collections.FindAll(); //データ取得 foreach (var item in result) { values.Add(item); } [/csharp]

これで, コレクション内のデータを全部引っ張り出すプログラムが実現できます. 比較的Linqのほうが用意されているライブラリよりも扱いやすいので, Linqをお勧めします.

一度に大量に詰め込んでもよく分からなくなりそうなのでこれくらいで. 今度は, 削除や更新などのすこし発展的な内容を書いてみようかと思います.