自分はあまり深いことは書けませんので最近ちょっと触り始めたmongoDBを操作する方法を紹介したいと思います。始めにmongoDBのバージョンは2.2.0でWindowsにインストールしています。C#ドライバは1.7を使用します。(特に1.7でないと出来ないようなことはしていないです)ざっくりmongoDBとは突然、mongoDBをLINQで検索してもmongoDBが良く分からない方もいると思うのでまず簡単にmongoDBってなんなのって話。mongoDBは、所謂NoSQLに分類されるデータベースです。ドキュメント指向DBでスキーマレスなのです。データはBSONと呼ばれるJSONちっくな構造で格納されます。レプリケーションやシャーディングという機能でサーバ間に分散してデータを持つことができます。説明終わり!(ざっくり過ぎてすいません)スキーマレスってどゆこと?スキーマレスというのはスキーマが無いってことです。(あう、そのままRDBだと必ず存在するテーブル定義が無いんです。分かりづらいですね実際に見てみましょう!まず何もコレクション(RDBで言うところのテーブル)が無い状態を確認する。[データベース名]をするとデータベースが作成されます。コレクションが存在するか確認してみます。collections何も表示されないですね!ここでRDBだとCreate文を流してテーブルを作る。collectionsテーブル定義的なものが無くていきなりデータが挿入できちゃいました。データを追加しますが今度はフィールド(RDBで言うこところのカラム)を増やして追加します。);db.samples.find();find()メソッドで検索すると2ドキュメント表示されます。2つのドキュメントで定義が異なるのが分かります。商品の購入システムみたいなものにしてみます。「注文」と「注文明細」があって「注文」は「注文明細」を複数持ちます。「注文」は「会員」を参照するようにします。クラス図だとこんな感じMongoDriverのインストールC#からmongoDBに接続するためには、公式からリリースされているMongoDriverを使用します。MongoDriverは、NuGetで取得できるので簡単にインストールできます。}}注文クラスは、注文明細(OrderDetail)をコレクションで持ちます。付けてマップ対象から除外します。}}データを挿入してみるまずマスタとなるMemberを使ってデータを挿入してみます。);}さて挿入されたかmongoShellで確認してみます。BsonIdは自動で振られます。今度はデータ取得してみます。);}出力結果を確認します。OK!OrderとOrderDetailを挿入するためにデータを作成します。mongoDBは、ドキュメント内にネストしてドキュメントを持てるのでOrderの中にOrderDetailを入れておいてOrderの挿入を行います。);}mongoShellで確認してみます。挿入されていますね分かりにくいですが、1つのドキュメントにネストしてドキュメントが存在しています。C#からも取得してみます。);}受注詳細のデータもちゃんと取得されてオブジェクトへのマッピングも出来てますね。準備はここまでで終わりです。データを検索してみるはぁ~長くってすいません。LINQの出番ですよ!挿入したデータでいろいろと試してみます。※データ適当に増やしています。mongoDBでLINQを使うには、MongoDB.Driver.Linq名前空間をusingする必要があります。普通にWhereメソッドでもやってみましょう。会員IDが1の人の購入履歴を取得する。);}結果Queryableなので当然といえば当然ですが、遅延評価されますので後から条件を追加することも出来ます。会員IDが3で2012年12月9日の受注を一覧しますが会員IDの条件と日付の条件は別なWhereメソッドで記述します。※クエリ部分だけ記述します。結果としては正しいですね。1クエリで問い合わせたかは分からないのでログを確認してみます。0ms1クエリになってますね。ネストされたドキュメント側のフィールドでも検索できます。0msちょっとデータを絞ってみます。上記から会員IDが3の人だけにします。0msこんな感じで普通のフィルタ処理であれば簡単にできます。会員マスタと連結もしてみたいと思います。});}結果あふん!Joinはサポートされていないというつれないエラー。まあLINQでなくても元々mongoDBはJOINをサポートしていないですから当然の結果かと思います。※MongoDBRefというクラスを使えばクライアント側でのJOINは可能なようです。今度はちゃんと結果を出力することが出来ました。0msログを見るとMemberIdでの絞り込みしかされていません。Joinはアプリ側でやっていることがわかります。mongoDBは、正規表現で検索することができます。会員のメールアドレスがaから始まるco.jpドメインのものを検索します。0msまあこれでも結果はいっしょです。0msログ見るとクエリ的には同じものですね合計値を求めてみます。);結果あら?例外ですねSumは実装されてないみたいですねmongoDB自体も2.2.0で漸くSumとかできるようになったみたいです。.AsEnumerable().Sum();これで出来ることは出来るのですが、全件アプリ側に持ってきてからの処理になるので件数が増えたら死ねますね※MapReduceという機能で集計はできるはずです。別途、書ければ書きます。最後にmongoDBは、RDBでは難しいことが簡単に出来たりします。(逆に出来ないこともあります)要件に依っては、RDBよりもmongoDBを使ったほうがうまくいくこともあると思いますので興味があれば是非、試してみてください。(プロトタイプとか作るときは、スキーマレスはうれしいですよね)特にLINQが使えるのでC#erは、すぐに扱えるようになるんではないでしょうか?なんかLINQメソッドもまだいっぱいあるのに中途半端な記事になってしまった感が否めませんが詳しく知りたい方は、公式サイトをどうぞまあ何にせよ無事、折り返せたのでなによりです。明日は、@takeshikさんです。00:02mongoDBもLINQで行こう!Tweet広告を非表示にする関連記事2015-04-05Moqでprotectedメソッドをモックする通常は、テストしたいクラスが利用しているクラスのpublicメソ...2015-03-22ChainingAssertionでテストをエレガントにいつもの通りひさしぶりのブログです。以前から使っている@neu...2015-01-25AutoMapperでUpperCamelCaseとPascalCaseをMapする今年、初ブログだったりします。beta7をUbuntuで動かしてみるMoqでprotectedメソッドをモックするKnockout.jsの初期値をDOMから取得するChainingAssertionでテストをエレガントに月別アーカイブリンクはてなブログブログをはじめる(無料)お知らせ参加グループプログラミングはてなブログをはじめよう!cer1974さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。