更新数组中的特定元素
在此步骤中,你将学习如何修改数组中的特定元素。当你的数组包含对象,并且你需要更新其中某个对象的字段时,这将非常有用。
首先,让我们插入一个新的学生文档。此文档的 courses 数组将包含对象,每个对象都有 name 和 grade 字段。
db.students.insertOne({
name: "Bob Smith",
courses: [
{ name: "Mathematics", grade: "B" },
{ name: "Computer Science", grade: "A" },
{ name: "Physics", grade: "C" }
]
})
假设我们想将 Bob 在 "Computer Science" 中的成绩从 "A" 改为 "A+"。我们可以使用位置操作符 $。此操作符充当匹配查询条件的第一个元素的占位符。
db.students.updateOne(
{ name: "Bob Smith", "courses.name": "Computer Science" },
{ $set: { "courses.$.grade": "A+" } }
)
在此命令中,查询 { "courses.name": "Computer Science" } 识别了正确的数组元素。然后,更新 { $set: { "courses.$.grade": "A+" } } 使用 $ 来引用该元素并更新其 grade 字段。
让我们验证一下更改。
db.students.findOne({ name: "Bob Smith" })
输出将显示更新后的成绩:
{
_id: ObjectId('...'),
name: 'Bob Smith',
courses: [
{ name: 'Mathematics', grade: 'B' },
{ name: 'Computer Science', grade: 'A+' },
{ name: 'Physics', grade: 'C' }
]
}
你还可以使用所有位置操作符 $[ ] 一次更新数组中的所有元素。让我们为 Bob 的所有课程添加一个 semester 字段。
db.students.updateOne(
{ name: "Bob Smith" },
{ $set: { "courses.$[].semester": "Fall 2023" } }
)
检查最终文档以查看结果。
db.students.findOne({ name: "Bob Smith" })
数组中的所有课程对象现在都具有 semester 字段。
{
_id: ObjectId('...'),
name: 'Bob Smith',
courses: [
{ name: 'Mathematics', grade: 'B', semester: 'Fall 2023' },
{ name: 'Computer Science', grade: 'A+', semester: 'Fall 2023' },
{ name: 'Physics', grade: 'C', semester: 'Fall 2023' }
]
}