【初心者】MongoDB C#/.NET Driverを使用して動的クエリをビルド

オウルです。

今回の題材はMongoDBです。MongoDBはNoSQLでドキュメント指向データベースです。そのMongoDBをMongoDB C#/.NET Driverを使用して検索してみます。DBMSは慣れてるけどMongoDBは、、、ちょっと、、、という方にも分かり易いように、MongoDBのクエリをDBMSに置き換えたら、こんな感じのSQLというのを並べて紹介します。

ローカル環境
App ASP.NET Core 3.1.302
MongoDB 4.4.3
MongoDB C#/.NET Driver 2.11

MongoDBの準備

MongoDBのインストール、MongoDB 用 .NET ドライバーのインストール、MongoDBの構成は、ASP.NET Core と MongoDB で Web API を作成するに丁寧に解説されているため、参照しながら進めてください。

Redis、MongoDB、Kafkaらが相次いで商用サービスを制限するライセンス変更が話題となったのは、まだ記憶に新しいのでライセンス情報のリンクもあわせて載せておきます。

MongoDB.Driverで検索

MongoDBの準備が整ったらMongoDB C#/.NET Driverを使用して検索していきます。まずは、コレクションに格納するドキュメントのスキーマを定義します。

エンティティ(スキーマ)の定義

ドラクエウォークのこころをスキーマとして定義してみます。サンプルデータは前回の記事でも取り上げた「キラーマシン」と「キングスライム」にします。

こころのスキーマ

上記クラスで属性しているIdとUpdateDateTimeについて補足です。

IdはMongoDBコレクションにマッピングするために必須です。[BsonId]でドキュメントの主キーを指定しており、[BsonRepresentation(BsonType.ObjectId)]でMongoによってstringからObjectIdへ変換されます。

続いて、[BsonDateTimeOptions(Kind = DateTimeKind.Local)]ですが、まずMongoDBにおけるDateの取り扱いです。

MongoDB stores times in UTC by default, and will convert any local time representations into this form. Applications that must operate or report on some unmodified local time value may store the time zone alongside the UTC timestamp, and compute the original local time in their application logic.

とあるように、MongoDBは、デフォルトでUTCで時刻を格納します。ここでは、UTCから現地時間に変換するようにDateTimeKind.Localを指定しています。

特殊効果のスキーマ

登録データはこんな感じになりました。

オートマッピング

エンティティに列挙型を含めるため、Conventionsを設定します。

次に検索用のサービスを作成します。

MongoDBの操作

MongoDBの操作はMongoClientを使用します。

It is recommended to store a MongoClient instance in a global place, either as a static variable or in an IoC container with a singleton lifetime.

とあるため、MongoClientを使用するサービスはシングルトンサービスとしてDI登録します。

Startup.ConfigureServices

検索用のサービス

DIされたMongoDbSettingsの情報を元にMongoDB Serverに接続、データベースの取得、コレクションの取得を行います。

検索ではMongoDBクエリをビルドするのに、次のAPIを使用します。

  • Eq(等価演算子)
  • Lte|Gte(比較演算子)
  • Regex(正規表現)
  • In
  • ElemMatch

SearchCondition

検索条件クラスを準備しておきます。

IHeartService/HeartService

フィルタを定義するビルダーを準備します。検索条件により動的にクエリをビルドするため、ここではFilterDefinitionの配列を準備します。

おまけ

式ツリーも使えるので、これは完全に自分用のサンプルです。式ツリーをかくときは大体忘れれて式ツリーを見るところから始まるため、、、

コメントを残す

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

CAPTCHA