MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

MongoDBでドキュメントの挿入・更新前にバリデーション(検証)を行う方法

MongoDBでは、コレクション作成時にバリデーション(validator)を設定することで、ドキュメントの挿入や更新前にその内容が条件を満たしているかどうかを自動的にチェックできます。不正なデータがデータベースに登録されるのを防ぎたい場合に非常に便利な機能です。

validatorを設定したコレクションを作成する

以下の例では、「FirstName」フィールドが文字列型(string)であり、必ず存在するという条件を持つコレクション「demo356」を作成しています。

> db.createCollection("demo356", {validator: {
... $and: [ {"FirstName": {$type: "string", $exists: true}} ]
... }})
{ "ok" : 1 }

条件を満たすドキュメントを挿入する

まず、検証条件を満たす正しいドキュメントを挿入してみましょう。「FirstName」が文字列型のため、問題なく登録できます。

> db.demo356.insertOne({"FirstName":"Chris"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e568d49f8647eb59e5620c7")
}

条件を満たさないドキュメントを挿入すると?

次に、「FirstName」に数値を指定して挿入を試みます。この場合、検証条件(文字列型であること)に違反するため、挿入は拒否され、エラーが発生します。

> db.demo356.insertOne({"FirstName":909});
2020-02-26T20:52:58.497+0530 E QUERY [js] WriteError: Document failed validation :
WriteError({
    "index" : 0,
    "code" : 121,
    "errmsg" : "Document failed validation",
    "op" : {
        "_id" : ObjectId("5e568d52f8647eb59e5620c8"),
        "FirstName" : 909
    }
})
WriteError@src/mongo/shell/bulk_api.js:461:48
Bulk/mergeBatchResults@src/mongo/shell/bulk_api.js:841:49
Bulk/executeBatch@src/mongo/shell/bulk_api.js:906:13
Bulk/this.execute@src/mongo/shell/bulk_api.js:1150:21
DBCollection.prototype.insertOne@src/mongo/shell/crud_api.js:252:9
@(shell):1:1

エラーコード「121」は、ドキュメントがバリデーションに失敗したことを示します。このように、無効なデータは挿入前に自動的にブロックされます。

挿入されたドキュメントを確認する

find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。

> db.demo356.find();

実行結果は以下のとおりです。検証を通過したドキュメントのみが登録されていることがわかります。

{ "_id" : ObjectId("5e568d49f8647eb59e5620c7"), "FirstName" : "Chris" }

まとめ

db.createCollection()のvalidatorオプションに$andや$type、$existsなどの演算子を組み合わせることで、MongoDBでもアプリケーション側のコードに頼らず、データベースレベルでスキーマ検証を実現できます。データ品質を保ちたい実運用の環境では、ぜひ活用したい機能です。

  1. MongoDBでレコードを更新する方法|_idを指定したupdateの基本を解説

    MongoDBのレコード更新の基本MongoDBで既存のレコード(ドキュメント)を更新するには、_idフィールドを基準に対象を特定して更新するのが基本です。ここでは、サンプルコレクションを作成し、実際にupdateメソッドを使ってレコードを更新する手順を順番に見ていきましょう。1. サンプルコレクションとドキュメントの作成まず、insertOne()メソッドを使ってコレクション「demo458」にドキュメントを3件挿入します。> db.demo458.insertOne( {_id:101,"Name":"David" } ); { "a

  2. MongoDBで1つのクエリを使って複数のドキュメントを一括更新する方法(bulkWrite活用ガイド)

    MongoDBで1つのクエリで複数のドキュメントを更新するには?MongoDBで1回のリクエスト(1つのクエリ)で複数のドキュメントを効率的に更新したい場合は、bulkWrite()メソッドを使用します。bulkWrite()は、複数の書き込み操作(insert、update、deleteなど)をまとめてサーバーに送信できるため、個別にクエリを発行するよりもパフォーマンス面で優れています。ここでは、updateOne操作を組み合わせて、複数のドキュメントのフィールドを一度に更新する手順を具体的に解説します。1. コレクションの作成とドキュメントの挿入まず、insertOne()メソッドを使って