コレクションを作成した後に検証を追加したり、既存の検証スキーマを変更したりすると、コレクション内に無効なドキュメントが存在する可能性があります。 同様に、スキーマの validationAction
がwarn
の場合、コレクションには無効なドキュメントを含めることができます。 無効なドキュメントをクエリして、コレクションから更新または削除することができます。
指定したスキーマに一致する、または一致しないドキュメントを検索するには、クエリ演算子とともに $jsonSchema
を使用します。 同様に、書込み操作のクエリ条件で$jsonSchema
を使用することで、スキーマに基づいてドキュメントを更新または削除できます。
例
次のドキュメントを含む inventory
のサンプル コレクションを作成します。
db.inventory.insertMany( [ { item: "journal", qty: 25, size: { h: 14, w: 21, unit: "cm" }, instock: true }, { item: "notebook", qty: 50, size: { h: 8.5, w: 11, unit: "in" }, instock: true }, { item: "paper", qty: 100, size: { h: 8.5, w: 11, unit: "in" }, instock: 1 }, { item: "apple", qty: 45, status: "A", instock: true }, { item: "pears", qty: 50, status: "A", instock: true } ] )
スキーマ オブジェクトの定義
サンプル スキーマ オブジェクトを定義し、それをmyschema
という変数に保存します。
let myschema = { $jsonSchema: { required: [ "item", "qty", "instock" ], properties: { item: { bsonType: "string" }, qty: { bsonType: "int" }, size: { bsonType: "object", required: [ "unit" ], properties: { unit: { bsonType: "string" }, h: { bsonType: "double" }, w: { bsonType: "double" } } }, instock: { bsonType: "bool" } } } }
スキーマでは、次の検証が強制されます。
必須 フィールド:
item
BSONタイプstring
である必要があります。qty
BSONタイプinteger
である必要があります。instock
BSONタイプboolean
である必要があります。
size
存在する場合は以下の値を返します。BSONタイプ
object
である必要があります。必須の
string
フィールドとしてunit
を含める必要があります。埋め込み
h
フィールドとw
フィールドが存在する場合、それらはdouble
型である必要があります。
スキーマに一致するドキュメントの検索
これらのコマンドは、スキーマに一致するすべてのドキュメントを返します。
db.inventory.find(myschema) db.inventory.aggregate( [ { $match: myschema } ] )
どちらのコマンドも同じ結果を返します。
[ { _id: ObjectId("62b5cd5a14b92d148400f7a3"), item: 'apple', qty: 45, status: 'A', instock: true }, { _id: ObjectId("62b5cd5a14b92d148400f7a4"), item: 'pears', qty: 50, status: 'A', instock: true } ]
スキーマに一致しないドキュメントの検索
スキーマ検証ルールと一致しないコレクション内のドキュメントを検索するには、 演算子とともに$jsonSchema
$nor
を使用します。例:
db.inventory.find( { $nor: [ myschema ] } )
出力:
[ // Neither size.h nor size.w are type double { _id: ObjectId("62b5cd5a14b92d148400f79e"), item: 'journal', qty: 25, size: { h: 14, w: 21, unit: 'cm' }, instock: true }, // size.w is not a double { _id: ObjectId("62b5cd5a14b92d148400f79f"), item: 'notebook', qty: 50, size: { h: 8.5, w: 11, unit: 'in' }, instock: true }, // size.w is not a double and instock is not a boolean { _id: ObjectId("62b5cd5a14b92d148400f7a0"), item: 'paper', qty: 100, size: { h: 8.5, w: 11, unit: 'in' }, instock: 1 } ]
スキーマに一致しないドキュメントの更新
このコマンドは、スキーマに一致しないすべてのドキュメントを更新し、ドキュメントのisValid
フィールドをfalse
に設定します。
db.inventory.updateMany( { $nor: [ myschema ] }, { $set: { isValid: false } } )
更新を確認するには、コレクションにクエリします。
db.inventory.find()
出力:
[ { _id: ObjectId("62b5cd5a14b92d148400f79e"), item: 'journal', qty: 25, size: { h: 14, w: 21, unit: 'cm' }, instock: true, isValid: false }, { _id: ObjectId("62b5cd5a14b92d148400f79f"), item: 'notebook', qty: 50, size: { h: 8.5, w: 11, unit: 'in' }, instock: true, isValid: false }, { _id: ObjectId("62b5cd5a14b92d148400f7a0"), item: 'paper', qty: 100, size: { h: 8.5, w: 11, unit: 'in' }, instock: 1, isValid: false }, { _id: ObjectId("62b5cd5a14b92d148400f7a3"), item: 'apple', qty: 45, status: 'A', instock: true }, { _id: ObjectId("62b5cd5a14b92d148400f7a4"), item: 'pears', qty: 50, status: 'A', instock: true } ]
スキーマに一致しないドキュメントの削除
このコマンドは、スキーマに一致しないすべてのドキュメントを削除します。
db.inventory.deleteMany( { $nor: [ myschema ] } )
更新を確認するには、コレクションにクエリします。
db.inventory.find()
出力:
[ { _id: ObjectId("62b5cd5a14b92d148400f7a3"), item: 'apple', qty: 45, status: 'A', instock: true }, { _id: ObjectId("62b5cd5a14b92d148400f7a4"), item: 'pears', qty: 50, status: 'A', instock: true } ]