MongoDB に挿入または更新されるデータを検証する最良の方法は何ですか? 検証を行うサーバーで実行されるJavascriptコードを書くことですか?
6 に答える
MongoDB 3.2以降、ドキュメントの検証(スライド)が追加されました。
ほとんどすべての mongo クエリ演算子 ( 、 、 、および を除く) を使用するバリデータ オプションを使用して、各コレクションの検証ルールを指定できます。$geoNear
$near
$nearSphere
$text
$where
バリデータを使用して新しいコレクションを作成するには、次を使用します。
db.createCollection("your_coll", {
validator: { `your validation query` }
})
バリデーターを既存のコレクションに追加するには、バリデーターを追加できます。
db.createCollection("your_coll", {
validator: { `your validation query` }
})
検証は挿入/更新でのみ機能するため、古いコレクションでバリデーターを作成すると、以前のデータは検証されません (以前のデータに対してアプリケーション レベルの検証を記述できます)。また、 validationLevelとvalidationActionを指定して、ドキュメントが検証に合格しなかった場合に何が起こるかを伝えることもできます。
検証に失敗したものでドキュメントを挿入/更新しようとすると (奇妙な検証レベル/アクションを指定していない場合)、エラーが発生しますwriteResult
(悲しいことに、エラーは何が失敗したかを通知せず、デフォルトのみを取得しますvalidation failed
):
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 121,
"errmsg" : "Document failed validation"
}
})
MongoDB には制約やトリガーがないため、アプリケーションはデータを検証する必要があります。
無効なデータがあるかどうかを 1 日 1 回以上チェックする Javascript スクリプトを作成することもできます。これを使用して、アプリケーションのビジネス ロジックの品質を確認できます。
あなたのアプリがこの種のことを処理するのは普通だと思います。データが何らかの形で無効な場合は、検出したエラーをユーザーが修正するまでデータストアに追加しないでください。
Zend Framework ベースのアプリケーション内で、MongoDB と PHP を一緒に使い始めたところです。
MongoDB コレクションごとに 1 つのオブジェクトを作成しました (たとえば、User.php はユーザー コレクションにマップされます)。各オブジェクトは、マップ先のコレクションと必要なフィールドを認識しています。また、各フィールドにどのフィルタ ( Zend_Filter_Input ) とバリデータ ( Zend_Validate ) を適用する必要があるかも認識しています。MongoDB の insert() または save() を実行する前に、すべてのバリデータを実行する $object->isValid() を実行します。それらがすべてパスした場合、isValid() は true を返し、insert() または save() の実行に進みます。それ以外の場合は、エラーを表示します。