1.更新數組中單個元素
首先通過(guo)下述(shu)語(yu)句(ju)創建(jian)一張student(學(xue)生成績表),并插入3條(tiao)語(yu)句(ju),grades為(wei)分(fen)數數組。
db.students.insert([
{ "_id" : 1, "grades" : [ 85, 80, 80 ] },
{ "_id" : 2, "grades" : [ 88, 90, 92 ] },
{ "_id" : 3, "grades" : [ 85, 100, 90 ] }
])
如果(guo)我們想(xiang)更新grades數(shu)組中,分(fen)數(shu)等于80的第一個數(shu)組元素,我們可以使用(yong)下述命令,
db.students.updateOne(
{ _id: 1, grades: 80 },
{ $set: { "grades.$" : 82 } }
)
執行完(wan)之后,學生成績表(biao)的數據(ju)如下:
{ "_id" : 1, "grades" : [ 85, 82, 80 ] }
{ "_id" : 2, "grades" : [ 88, 90, 92 ] }
{ "_id" : 3, "grades" : [ 85, 100, 90 ] }
若是數組元素為對象(xiang)的情況,采用(yong)下述語法進(jin)行更新,
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 }
]
}
假如我(wo)們想(xiang)更(geng)新數組對象中,grade=85對象的(de)std元素的(de)值,可以使用下述語句(ju)
db.students.updateOne(
{ _id: 4, "grades.grade": 85 },
{ $set: { "grades.$.std" : 6 } }
)
語句執行完成之后,結果如下(xia)
{
"_id" : 4,
"grades" : [
{ "grade" : 80, "mean" : 75, "std" : 8 },
{ "grade" : 85, "mean" : 90, "std" : 6 },
{ "grade" : 85, "mean" : 85, "std" : 8 }
]
}
2.更新數組中所有元素
采(cai)用(yong)下屬命令格式更新
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.根據數組元素條件查詢
根(gen)據數(shu)組元(yuan)素(su)條件查詢,可以使用$elemMatch,
示例:
db.students2.find({'name':'lisi', 'grades':{$elemMatch:{'grade': 90}}}).pretty();
上述(shu)命(ming)令可(ke)以將(jiang)姓(xing)名(ming)是lisi且(qie)grades數組元素對象中,屬性grade=90的文(wen)檔查詢出來,某(mou)些情(qing)況下,數組元素對象很多(duo),若只想顯示符(fu)合(he)條件的指(zhi)定數組,可(ke)以使用下述(shu)命(ming)令
db.students2.find({'name':'lisi', 'grades.grade':90}, {'grades':{$elemMatch:{'grade':90}}}).pretty();