最近、MongoDB(バージョン3.2.9)の作業を開始し、データベースレベルの一貫性が好きなので、検証機能を試したかったのです。MongoDBのバリデーターは動作しません
私はすでに行っているように、ビジネスロジックでこの検証を行うことができます。 セキュリティの追加レイヤーがあればうれしいです。
私はタイプ'string'
とタイプ'string'
のdesc
の種類'int'
の_id
、name
で収集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
パラメータだけが以前は空のディレクトリに設定されています。