Mongodb数组操作$(update)、$占位符更新嵌套数组、嵌套文档集合

一、更新数组中的值

看如下students文档中的数据:

db.students.insert({_id:NumberInt(1),grades:[NumberInt(80),NumberInt(85),NumberInt(90)]})
db.students.insert({_id:NumberInt(2),grades:[NumberInt(88),NumberInt(90),NumberInt(92)]})
db.students.insert({_id:NumberInt(3),grades:[NumberInt(85),NumberInt(100),NumberInt(90)]})


/* 1 */
{"_id" : 1,"grades" : [ 80, 85, 90]}

/* 2 */
{ "_id" : 2,"grades" : [ 88,  90, 92 ]}

/* 3 */
{"_id" : 3,"grades" : [ 85, 100,  90]


将第一个文档中grade字段中值为80更新为82,如果不知道数组中元素的位置,可以使用位置$操作符。

db.students.update({_id:1, grades:80},{$set:{'grades.$':NumberInt(82)}})

请记住,位置$操作符充当更新文档查询中第一个匹配的占位符。


二、使用位置操作符$访问数组中嵌套的字段

db.collection.update(
   { <query selector> },
   { <update operator>: { "array.$.field" : value } }
)

看如下students文档集合中grades的嵌套文档集合

{
  _id: 4,
  grades: [
     { grade: 80, mean: 75, std: 8 },
     { grade: 85, mean: 90, std: 5 },
     { grade: 90, mean: 85, std: 3 }
  ]
}

更新集合文档的嵌套文档的grade值为85的文档的std字段的值为6

db.students.update(
   { _id: 4, "grades.grade": 85 },
   { $set: { "grades.$.std" : 6 } }
)

三、使用多个字段匹配更新嵌入式文档

位置操作符$能够更新第一个匹配的数组元素通过$elemMatch()操作符匹配多个内嵌文档的查询条件


考虑如下的students集合文档grades字段是一个嵌套字段的文档

{
  _id: 4,
  grades: [
     { grade: 80, mean: 75, std: 8 },
     { grade: 85, mean: 90, std: 5 },
     { grade: 90, mean: 85, std: 3 }
  ]
}

如下语句会更新嵌套文档中的std值为6,条件是文档的主键是4,字段grades的嵌套文档字段grade字段值小于等于90mean字段值大于80

db.students.update(
   {
     _id: 4,
     grades: { $elemMatch: { grade: { $lte: 90 }, mean: { $gt: 80 } } }
   },
   { $set: { "grades.$.std" : 6 } }
)

上面的操作语句会更新掉第一个匹配的嵌套文档集合,如下:

{
  _id: 4,
  grades: [
    { grade: 80, mean: 75, std: 8 },
    { grade: 85, mean: 90, std: 6 },
    { grade: 90, mean: 85, std: 3 }
  ]
}




评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值