2016-09-20 6 views
1

最近、MongoDB(バージョン3.2.9)の作業を開始し、データベースレベルの一貫性が好きなので、検証機能を試したかったのです。MongoDBのバリデーターは動作しません

私はすでに行っているように、ビジネスロジックでこの検証を行うことができます。 セキュリティの追加レイヤーがあればうれしいです。

私はタイプ'string'とタイプ'string'descの種類'int'_idnameで収集categoryを追加してみました。

これらの値はすべて存在するはずですが、コンテンツの制限はありません。

は今、manual次、私は次のコードになってしまった:すでにこの簡単な構造で、しかし

、MongoDBのは文句:今すぐ

{ "ok" : 0, "errmsg" : "unknown operator: $and", "code" : 2 } 

、私はthis similar questionを見つけましたが、ただ行って複数の制約を直接の中に入れようとしましたそれは、私が今、次のinsertのいずれかのコマンドを実行することができなければならないようにコレクションを作成しながら

db.createCollection('category', { 
    validator: { $or: 
    [ 
     { _id: { $exists: true } }, 
     { _id: { $type: 'int' } }, 
     { name: { $exists: true } }, 
     { name: { $type: 'string' } }, 
     { desc: { $exists: true } }, 
     { desc: { $type: 'string' } } 
    ] 
    } 
}) 

しかし、今、:10個の配列

db.category.insert({}) 
db.category.insert({_id: 17, name: '', desc: 'valid'}) 
db.category.insert({_id: 42, name: 42, desc: ''}) 
db.category.insert({_id: 43, name: '', desc: 42}) 
db.category.insert({_id: '', name: 42, desc: 42}) 

db.category.find()は今

{ "_id" : ObjectId("57e19650b10ab85eca323684") } 
{ "_id" : 17, "name" : "", "desc" : "valid" } 
{ "_id" : 42, "name" : 42, "desc" : "" } 
{ "_id" : 43, "name" : "", "desc" : 42 } 
{ "_id" : "", "name" : 42, "desc" : 42 } 
返します

最後の手段として、$or演算子を$andに変更しようとしました。すべてのルールを有効にする必要があります。少なくとも1つ。私にとって最も合理的と思われるこのアプローチで

db.createCollection('category', { 
    validator: { $and: 
    [ 
     { _id: { $exists: true } }, 
     { _id: { $type: 'int' } }, 
     { name: { $exists: true } }, 
     { name: { $type: 'string' } }, 
     { desc: { $exists: true } }, 
     { desc: { $type: 'string' } } 
    ] 
    } 
}) 

、それはしかし、すべてのでを動作しません。上述したように、db.version()戻り3.2.9への呼び出しを

WriteResult({ 
     "nInserted" : 0, 
     "writeError" : { 
       "code" : 121, 
       "errmsg" : "Document failed validation" 
     } 
}) 

insertsを述べた上記のどんなに私は5のうち有効なものは、すべて私に同じエラーを与えて、どれも機能しない、あります、心にあなたを使用してみました私はWindowsマシンでデフォルトのMongoDB 64ビット配布を実行しており、--dbpathパラメータだけが以前は空のディレクトリに設定されています。

答えて

1

関数NumberInt()を使用して32ビットの整数値を指定してください。それ以外の場合は、Doubleと解釈されます。

次の挿入は、ドキュメントをコレクションに挿入するために必要です。

成功のシナリオ: -

db.category.insert({_id: NumberInt(17), name: "aaaa", desc: "valid"}) 

障害シナリオ: -

db.category.insert({_id: NumberInt(42), name: 42, desc: ''}) 
関連する問題