MongoDBでバリデーション(検証)を実行する方法
MongoDBにおけるドキュメントの検証とは
MongoDBでは、コレクション作成時にvalidator(バリデータ)を設定することで、ドキュメントのスキーマ検証を行うことができます。これにより、不正なデータ型や必須フィールドの欠落を含むドキュメントの挿入を防ぎ、データ品質を維持できます。
本記事では、$jsonSchemaを使ったバリデーションの実装方法と、実際の動作確認の手順を解説します。
バリデーション付きコレクションの作成
db.createCollection()メソッドにvalidatorオプションを指定することで、検証ルールを定義したコレクションを作成できます。以下の例では、「FirstName」と「LastName」を必須の文字列フィールドとして設定しています。
> db.createCollection( "demo437" , {
... validator: { $jsonSchema: {
... bsonType: "object",
... required: [ "FirstName", "LastName"],
... properties: {
... FirstName: {
... bsonType: "string",
... description: "This is required" },
... LastName: {
... bsonType: "string",
... description: "This is required" }
...
... }
... }}})
{ "ok" : 1 }
{ "ok" : 1 }と表示されれば、バリデーションルールを持つコレクションが正常に作成されています。
バリデーションの動作確認
それでは、実際にドキュメントを挿入して、バリデーションが正しく機能するか確認してみましょう。
ケース1:LastNameに数値を指定した場合(エラー)
「LastName」に文字列ではなく数値(1234)を指定して挿入を試みると、検証に失敗しエラーが返されます。
> db.demo437.insertOne({"FirstName":"John","LastName":1234});
2020-03-22T17:49:55.590+0530 E QUERY [js] WriteError: Document failed validation :
WriteError({
"index" : 0,
"code" : 121,
"errmsg" : "Document failed validation",
"op" : {
"_id" : ObjectId("5e7757ebbbc41e36cc3cae9a"),
"FirstName" : "John",
"LastName" : 1234
}
})
エラーコード121(Document failed validation)が発生し、ドキュメントは挿入されません。これは「LastName」がbsonType: "string"というルールに違反しているためです。
ケース2:両方とも正しい型の場合(成功)
「FirstName」と「LastName」の両方に文字列を指定すると、挿入は正常に完了します。
> db.demo437.insertOne({"FirstName":"John","LastName":"Smith"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e7757f7bbc41e36cc3cae9b")
}
ケース3:FirstNameに数値を指定した場合(エラー)
今度は「FirstName」に数値(9887)を指定すると、同様に検証エラーとなります。
> db.demo437.insertOne({"FirstName":9887,"LastName":"Miller"});
2020-03-22T17:50:29.631+0530 E QUERY [js] WriteError: Document failed validation :
WriteError({
"index" : 0,
"code" : 121,
"errmsg" : "Document failed validation",
"op" : {
"_id" : ObjectId("5e77580dbbc41e36cc3cae9c"),
"FirstName" : 9887,
"LastName" : "Miller"
}
})
ケース4:正しいデータを挿入(成功)
最後に、両方のフィールドが文字列である正常なドキュメントを挿入します。
> db.demo437.insertOne({"FirstName":"David","LastName":"Miller"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e775816bbc41e36cc3cae9d")
}
挿入されたドキュメントの確認
find()メソッドを使用して、コレクション内のすべてのドキュメントを表示します。
> db.demo437.find();
出力結果は以下の通りです。
{ "_id" : ObjectId("5e7757f7bbc41e36cc3cae9b"), "FirstName" : "John", "LastName" : "Smith" }
{ "_id" : ObjectId("5e775816bbc41e36cc3cae9d"), "FirstName" : "David", "LastName" : "Miller" }
このように、バリデーションを通過できた2件のドキュメントのみが保存されていることがわかります。型違反のあったドキュメントは挿入されず、自動的に除外されました。
まとめ
MongoDBの$jsonSchemaによるバリデーションを活用すれば、アプリケーション側でのチェックに加えて、データベースレベルでもデータの整合性を保証できます。特に複数のシステムから同じコレクションへ書き込みが行われる環境では、スキーマ検証による防御が非常に有効です。bsonTypeやrequired以外にも、列挙値の制限(enum)、数値範囲の指定など、さまざまな検証ルールが用意されているので、用途に応じて活用してみてください。
-
MongoDBで全文検索を実行する方法 – $text演算子の使い方
MongoDBで全文検索(フルテキスト検索)を実行するには、$text 演算子を使用します。$text は、テキストインデックスが設定されたフィールドの内容に対してテキスト検索を行うための機能です。本記事では、実際のコマンド例とともに、インデックス作成から検索実行までの手順を解説します。 1. テキストインデックスの作成 まず、createIndex() メソッドを使って、検索対象となるフィールドにテキストインデックスを作成します。以下の例では、demo654 コレクションの Name フィールドに対してテキストインデックスを設定しています。 > db.demo654.createI
-
MongoDBで一括挿入(バルクインサート)を実行する方法
MongoDBで多数のドキュメントをまとめて登録したい場合、一括挿入(バルクインサート)を利用すると効率的です。一括挿入を実行するには、initializeUnorderedBulkOp()メソッドを使用します。 一括挿入の手順 まず、initializeUnorderedBulkOp()でバルク操作のオブジェクトを作成し、insert()メソッドで複数のドキュメントを追加していきます。最後にexecute()を呼び出すことで、まとめてデータベースに書き込まれます。 > var bulkInsertDoc = db.demo663.initializeUnorderedBulkOp