Docs 菜单
Docs 主页
/
数据库手册
/ /

查询和修改有效或无效文档

如果在创建集合后向其添加验证,或修改现有验证模式,则集合中可能包含无效文档。 同样,如果模式的 validationActionwarn ,则允许您的collection包含无效文档。您可以查询无效的文档,以便有可能将其从collection中更新或删除。

要查找与指定模式匹配或不匹配的文档,请将 $jsonSchema与查询运算符一起使用。 同样,您可以在写入操作的查询条件中使用$jsonSchema ,根据模式更新或删除文档。

使用以下文档创建样本collectioninventory

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

    • 必须包含 unit 作为必填 string字段。

    • 如果存在嵌入式 hw 字段,则它们的类型必须为 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
}
]

后退

修改规则

在此页面上