Docs Menu
Docs Home
/
データベース マニュアル
/ /

有効または無効なドキュメントのクエリと変更

コレクションを作成した後に検証を追加したり、既存の検証スキーマを変更したりすると、コレクション内に無効なドキュメントが存在する可能性があります。 同様に、スキーマの validationActionwarnの場合、コレクションには無効なドキュメントを含めることができます。 無効なドキュメントをクエリして、コレクションから更新または削除することができます。

指定したスキーマに一致する、または一致しないドキュメントを検索するには、クエリ演算子とともに $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
}
]

戻る

ルールを変更する

項目一覧