1.更新数组中单个元素
首先通过下述语句创建一张student(学生成绩表),并插入3条语句,grades为分数数组。
db.students.insert([
{ "_id" : 1, "grades" : [ 85, 80, 80 ] },
{ "_id" : 2, "grades" : [ 88, 90, 92 ] },
{ "_id" : 3, "grades" : [ 85, 100, 90 ] }
])
如果我们想更新grades数组中,分数等于80的第一个数组元素,我们可以使用下述命令,
db.students.updateOne(
{ _id: 1, grades: 80 },
{ $set: { "grades.$" : 82 } }
)
执行完之后,学生成绩表的数据如下:
{ "_id" : 1, "grades" : [ 85, 82, 80 ] }
{ "_id" : 2, "grades" : [ 88, 90, 92 ] }
{ "_id" : 3, "grades" : [ 85, 100, 90 ] }
若是数组元素为对象的情况,采用下述语法进行更新,
db.collection.update(
{ <query selector> },
{ <update operator>: { "array.$.field" : value } }
)
示例:
{
_id: 4,
grades: [
{ grade: 80, mean: 75, std: 8 },
{ grade: 85, mean: 90, std: 5 },
{ grade: 85, mean: 85, std: 8 }
]
}
假如我们想更新数组对象中,grade=85对象的std元素的值,可以使用下述语句
db.students.updateOne(
{ _id: 4, "grades.grade": 85 },
{ $set: { "grades.$.std" : 6 } }
)
语句执行完成之后,结果如下
{
"_id" : 4,
"grades" : [
{ "grade" : 80, "mean" : 75, "std" : 8 },
{ "grade" : 85, "mean" : 90, "std" : 6 },
{ "grade" : 85, "mean" : 85, "std" : 8 }
]
}
2.更新数组中所有元素
采用下属命令格式更新
db.collection.update(
{ <query selector> },
{ <update operator>: { "array.$[].field" : value } }
)
示例
db.students2.update(
{_id: 5 },
{ $set: { "grades.$[].grade" : 90, "grades.$[].stu" : 9} },
{ multi: true }
)
3.根据数组元素条件查询
根据数组元素条件查询,可以使用$elemMatch,
示例:
db.students2.find({'name':'lisi', 'grades':{$elemMatch:{'grade': 90}}}).pretty();
上述命令可以将姓名是lisi且grades数组元素对象中,属性grade=90的文档查询出来,某些情况下,数组元素对象很多,若只想显示符合条件的指定数组,可以使用下述命令
db.students2.find({'name':'lisi', 'grades.grade':90}, {'grades':{$elemMatch:{'grade':90}}}).pretty();