C#からMongoDBを触ってみる-更新と削除

前回、C#からのデータ挿入と、検索について書いたので、今回は更新と削除について書いてみる。

更新

更新はMongoDB API方式(検索条件に一致したもの全てを更新)と検索結果を得てから更新する方法の2種類がある。

MongoDB API方式の場合、collectionのFindAndModifyを使用する。代表的な、オーバーロードとして以下のものがある。

<collection>.FindAndModify(IMongoQUery, IMongoSortBy, IMongoUpdate)

IMongoQueryは一般的に、Queryクラスのスタティックメソッドを使用して、検索条件を指定する。

例えば、Name.StartsWith(“Jon”) && Country == “US”という検索条件を表すには、

Query.AND(Query.Matches(“Name”,”^Jon”),Query.EQ(“Country”,”US”))

となる。

IMongoSortByにはSortByクラスのスタティックメソッドを使用して、ソート条件を指定する。

SortBy.Ascending(string プロパティ名)    // 指定プロパティを昇順ソート
SortBy.Descending(string プロパティ名)    // 指定プロパティを降順ソート
SortBy.Null                    // ソート無し

通常はソートする必要が無いと思われるので、SortBy.Nullで良いと思う。ちなみに、ソート条件を複数指定するには、以下のようにする。

SortBy.Ascending(“Name”).Descending(“Birthday”)    // Nameで昇順ソート後、Birthdayで降順ソート

  • この関数ではあまり意味を持たないが必須。なお、検索メソッド(Find)では、メソッドの戻り値にソート条件を指定する。

    var cur = col.Find(Query.Matches(“Name”,”^Jon”)).SetSortOrder(SortBy.Ascending(“Name”));    // NameがJonで始まるデータをNameで昇順ソート

IMongoUpdateはUpdateクラスのスタティックメソッドを使用して、変更するプロパティと値を指定する。

Update.Set(“Office”,”東京”).Set(“Updated”,DateTime.Now)    // Officeプロパティを”東京”に、Updatedを現在時刻に更新

以下に例を示す

// オフィス名称を変更
var col = db.GetCollection<Employee>(“Employees”);
Console.Write(“現オフィス名”);
string oldOffice = Console.ReadLine();
Console.Write(“新オフィス名”);
string newOffice = Console.ReadLine();
// オフィス名称と更新日時を更新
col.FindAndModify(Query.EQ(“Office”,oldOffice),SortBy.Null,
  Update.Set(“Office”,newOffice).Set(“Updated”,DateTime.Now));

更新のもう一つの方法としては、検索などで取得したオブジェクトの値を変更して、Saveメソッドで保存する方法。

例えば、

// 指定した社員番号を持つデータを取得
var col = db.GetCollection<Employee>(“Employees”);
Console.Wrirte(“社員番号:”);
string EmpNo = Console.ReadLine();
Employee emp = col.AsQueryable().Where(p => p.EmpNo == EmpNo).First();
// 氏名を変更
emp.Name = “・・・”;
// 保存
col.Save(emp);

 
 

削除

削除は、MongoDB APIと同様なI/Fを使用する。削除に使用するメソッドはRemoveである。Removeの代表的なオーバーロードを以下に示す。

<collection>.Remove(IMongoQuery)

IMongoQueryはFindAndModify()で説明したように、検索条件を指定する。

Removeの他に、FindAndModifyと同様のFindAndRemoveを使用することも可能。

<collection>.FindAndRemove(IMongoQuery,IMongoSortBy)

なお、コレクション内容を全てクリアするには、<collection>.RemoveAll()メソッドを使用する。

以下に例を示す

// 指定された文字から始まる名前を持つユーザーを削除する
var col = db.GetCollection<User>(“Users”);
Console.Write(“Name Starts With : “)
string name = Console.ReadLine();
col.Remove(Query.Matches(“Name”,”^” + name));

たけぞう

たけぞう について

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

コメントを残す

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