C#からMongoDBを触ってみる

以前書いたように、MongoDBのC#ドライバはかなりの優れもので、LINQもサポートしている。

今回はC#プログラムからMongoDBのデータを操作してみよう。

まずは、ドライバAssemblyをダウンロードするのだが、VS2010,VS2012であれば、NuGetを使用するだけで、ドライバパッケージのダウンロードが完了する。パッケージ名はmongocsharpdriver。

今回の例では、下記のネームスペースを使用。

  • MongoDB.Driver
  • MongoDB.Driver.Builders
  • MongoDB.Driver.Linq
  • MongoDB.Bson
  • MongoDB.Bson.Serialization.Attributes

前提として、以下のようなクラスインスタンスを保存、参照することとする。

[BsonIgnoreExtraElements]
public class AddressEntry
{
  [BsonId]
  public BsonObjectId _id { get; set;}
  public string Name { get; set; }
  public DateTime Birthday { get; set; }
  public List<Email> EmailAddrs { get; set; }
}
[BsonIgnoreExtraElements]
public class Email
{
  public string DisplayName { get; set; }
  public string MailAddress { get; set; }
}

 

プログラムからMongoDBを使用するには、通常のDBサーバと同じようにMongoDBに接続する必要がある。接続を行うには、MongoClientクラスを使用する。

MongoClient cli = new MongoClient(<接続文字列>);    // System.Data.xxxClient的なコンストラクタ

接続文字列は、以下の形をとる。

mongodb://[<Uer Name>:<Password>@]<IP>[:<PORT>][/<Database名>]

なお、mongodがデフォルトポート設定(27017)になっていて、ユーザ管理を行っておらず、かつ、ローカルホストに対する処理を行う場合は、パラメータ無しのコンストラクタを使用すればOK。今回はこのコンストラクタを使用する。

次に使用するDatabaseを指定(取得)する。Databaseが作成されていない場合、自動的に作成される。

MongoDatabase db = cli.GetServer().GetDatabase(<Database名>);

データ操作はこのDatabase中のcollection(テーブルのようなもの)に対して行うこととなる。

今回は、Databaseを”TestDB”,collectionを”AddressBook”とする。

次にcollectionを取得。(これも作成されていない場合、自動的に作成される)

MongoCollection<T> col = db.GetCollection<T>(<collection名>);

ここまでを今回のプログラムに当てはめると、

// ローカルMongoDBに接続
MongoClient cli = new MongoClient();
// Databaseを選択
MongoDatabase db = cli.GetServer().GetDatabase("TestDB");
// コレクションの取得
MongoCollection<AddressEntry> col = db.GetCollection<AddressEntry>("AddressBook");

 

となる。

次にデータをインサートしてみよう。データをインサートするには、MongoCollectionクラスのInsertメソッドを使用する。(Saveメソッドも使用できるが、保存するタイミングで、idが設定されていないとエラーとなる。クラスメンバのBsonId属性のパラメータとしてIdGeneratorを指定することで、自動生成されるようだが、まだ試していないためInsertを使用する)

Insertメソッドの一番簡単な使用方法は、collectionの型のクラスインスタンスを渡す方法である。

今回は、AddressEntry型のcollectionとしているので、AddressEntryのインスタンスを作成して、データを設定後、Insertメソッドに渡すだけで良い。

// データ作成
AddressEntry entry = new AddressEntry(){
  Name = "すもも太郎",
  Birthday = DateTime.Parse("1964/02/03"),
  EmailAddrs = new List<Email>()
    {
      new Email() { DisplayName = "すもも太郎", MailAddress = "T.Sumomo@momo.com" },
      new Email() { DisplayName = "ぼのぼの", MailAddress = "Bonobono@bono.jp" }
    }
};
// データ挿入
col.Insert(entry);

 

次は、データを検索してみよう。データ検索はMongoDBのAPIを使う方法と、LINQを使う方法がある。LINQの方が簡単なので、LINQで検索してみる。LINQのソースとしては、collectionをQueryable化したものを使用する。つまり、AsQueryable()メソッドを呼び出せばよい。(検索条件に使用するメソッドがMongoDBのクエリに変換できない場合は、さらにAsEnumerable()を呼び出す必要がある。)

// Linqによる検索
var q = from t in col.AsQueryable() where t.Name.StartsWith("ずもも")// (MongoDB Shellのdb.AddressBook.find(/^ずもも/)に相当 select t;

 

プログラム全体は以下のような感じとなる。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MongoDB.Driver;
using MongoDB.Driver.Builders;
using MongoDB.Driver.Linq;
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;

namespace
MongoSample
{ class Program { static void Main(string[] args) { // ローカルMongoDBに接続 MongoClient cli = new MongoClient(); // Databaseを選択 MongoDatabase db = cli.GetServer().GetDatabase("TestDB"); // コレクションの取得 MongoCollection<AddressEntry> col = db.GetCollection<AddressEntry>("AddressBook"); // データ作成 if (col.Count() != 0) // データがあったら削除 { col.RemoveAll(); } AddressEntry entry = newAddressEntry() { Name = "すもも太郎", Birthday = DateTime.Parse("1964/02/03"), EmailAddrs = new List<Email>() { newEmail() { DisplayName = "すもも太郎", MailAddress = "T.Sumomo@momo.com" }, new Email() { DisplayName = "ぼのぼの", MailAddress = "Bonobono@bono.jp" } } }; // データ挿入 col.Insert(entry); ・・・ // Linqによる検索 var q = from t in col.AsQueryable() where t.Name.StartsWith("ずもも") select t;
foreach (var ent in q) { Console.WriteLine("Name = {0} {1}生まれ", ent.Name, ent.Birthday.ToString("yyyy年MM月dd日")); foreach (var email in ent.EmailAddrs) { Console.WriteLine("\t{0}<{1}>", email.DisplayName, email.MailAddress); } } // サーバ切断 cli.GetServer().Disconnect(); } }
}

他に、更新と削除,インデックス操作等があるが、今回はここまで。

たけぞう

たけぞう について

某ソフトウェア開発会社勤務。 開発の仕事は卒業しますた。 ・・・と思ったら、また開発に逆戻り(^^; ・・・と思ったら、また卒業らしい・・・
カテゴリー: C#, LINQ, NO SQL, 技術情報 パーマリンク

C#からMongoDBを触ってみる への1件のフィードバック

  1. たけぞう たけぞう のコメント:

    この間試してみたら、IDを指定しなくてもSaveメソッドで保存が可能だった。
    もしかして、[BsonId]属性を付けるとだめなのかな?
    (保存できたのはこの属性を付けていないクラスだった)
    それとも、ドライバのバージョンのせいだろうか・・・
    [BsonId]属性は公式サイトのサンプルに入っていたので、入れてあるのだけど・・・
    ちょっと調べてみよう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です