2016-04-06 16 views
2

Mongo 3.2ではドキュメントの検証が行われていますが、これを行うためにmongooseを使用せずにスキーマを定義することはできますか?たとえば、次のようにMongooseスキーマ対Mongo検証ツール

マングース

userschema = mongoose.Schema({ 
    org: String, 
    username: String, 
    fullname: String, 
    password: String, 
    email: String 
}); 

MongoDBの

db.createCollection(
    "example",{ 
    validator:{ 
     $and:[ 
     { "org":{$type:"string"}}, 
     { "username":{$type:"string"}}, 
     { "fullname":{$type:"double"}}, 
     {"password":$type:"string"}}, 
     {"email":{$type:"string"}} 
     ] 
    }, 
    validationLevel:"strict", 
    validationAction:"error" 
}) 

何これらのけん引間のARのエーテル:差と、我々は、スキーマのようにバリデータを使用して、オプションの場を提供することができますか?

彼らそれぞれ異なる制限がありますので、私は両方を使用
+0

これはちょっと広すぎますが、一言で言えば、違いは次のとおりです。1. MongoDBの検証は、「クライアント側」のスキーマ定義で利用可能な機能として「完全」とは言えません。 2. MongoDBスキーマの検証は、「クライアント」ではなく「サーバー」で行われるため、「アトミック」操作による変更でも「ある程度」検証することができます。 「機能」は非常に幼児期であり、「クエリ式」に強く依存しますが、「クライアント」フレームワークは完全な言語サポートを備えています。もちろん、すべての操作は "クライアント"で検証する必要があります。 –

+0

また、あなたの質問の開始声明で述べたように。これは** MongoDB 3.2.x以上が必要です。これは現在「最新リリース」であり、比較的新しいリリースであるため、これは誰にとっても大したことではありません。また、エラーメッセージは「たくさんの作業」を必要とし、mongooseのようなクライアントフレームワークが与えることのできるものほどにはわかりません。 –

答えて

1

:「

  • マングースのバリデータは、更新クエリのすべてのタイプでは動作しませんし、バリができるので、バリデータは更新のみドキュメント内の値とパス上で実行しますたとえば、データベースには必須フィールドがすでに定義されていて、クライアントのメモリには定義されていないかどうかはわかりません(issue参照)。 これは、[Mongooseバリデーターに加えて] MongoDBバリデーターを使用する主な理由です。

    更新のみ(> = 4.8.0および$push$addToSet$set$unset操作で実行バリ。

    つまり、あなたのマングーススキーマにrequired: trueでフィールドを持つことができますが、update操作は、実際にその場を必要としません!検証中に他のフィールドを参照することはできませんほとんどの部分は

    db.runCommand({collMod: "collection", validator: {myfield: {$exists: true}}}) 
    
  • のMongoDB:MongoDBのバリデータはこの問題を解決することができます。たとえば、{field1: {$lte: field2}}と言うことはできません。モンゴーズ検証者は他のフィールドを参照することができます。

    あなたはしかし、クロスフィールド参照のいくつかの非常に基本的な種類を行うことができます:あなたはマングース弁別器(継承)を使用し、それぞれの子のタイプごとに異なる要件を持っている場合、これは便利になる

    {validator: {myfield1: "Value 1", $and: [/* other validators */]} 
    

  • MongoDBは、検証に失敗した場合に「nice」エラーを出力しません。それは単にwriteError: {code: 121, errmsg: "Document failed validation}のようなものです。モンゴースは通常Path 'foo.bar' failed validationのようなものです。彼らは共有

アビリティ:

  • タイプの検証。 Mongooseは、スキーマで指定された型に値をキャストしようとします。 $type属性を持つMongoDBは、タイプの不一致の場合に妥当性検査の失敗を引き起こします。

  • 最小値と最大値。 Mongooseはスキーマ上でmin属性とmax属性を使用します。 MongoDBは$lt,$lte,$gtおよび$gteを使用します。

  • 文字列列挙型。モンゴースはenum: [values]を使用します。 MongoDBは$in: [values]を使用します。

  • 文字列の長さの検証。モンゴース:minlength: 2, maxlength: 10。 MongoDBでは、正規表現:{fieldname: {$regex: /.{2,10}/}}を使用してください。

  • アレイ長の検証。あなたはカスタムバリデーターを使用する必要があります。 MongoDB:{fieldName: {$size: 2}}

  • 文字列の正規表現一致。あなたはカスタムバリデーターを使用する必要があります。


最初の箇条書きは、主要なものです。 MongoDBにはトランザクションはありませんが、強力なアトミックな更新があります。 MongoDBでネイティブのバリデータを使用することは、このような場合には非常に重要です。

関連する問題