十二、mongodb之数组更新运算符

#                           数组更新运算符


数组更新运算符:

运算符含义
$充当占位符以更新与查询条件匹配的第一个元素,占位符:代表匹配条件的第一个元素
$[]充当占位符以更新数组中与查询条件匹配的文档中的所有元素
$[< identifier>]充当占位符以更新与查询条件匹配的文档的arrayFilters条件匹配的所有元素
$addToSet仅当数组中尚不存在元素时才将元素添加到数组中
$pop删除数组的第一个或最后一个项目
$pull删除与指定查询匹配的所有数组元素
$push将项添加到数组
$pullAll从数组中删除所有匹配的值


**数组更新修饰符:** | 运算符| 含义| | :-------------:|:-------------:| | $each | 修改push和addToSet运算符以附加多个项目以进行数组更新| | $position| 修改push运算符以指定数组中添加元素的位置| | $slice | 修改 push运算符以限制更新数组的大小 | |$sort|修改push运算符以重新排序存储在数组中的文档|

###1、$单个元素占位符

例子:

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

操作:

db.students.updateOne(
   { _id: 1, grades: 80 },   #查找_id=1且grades数组中80的数字
   { $set: { "grades.$" : 82 } }  #grades.$表示符合条件的第一个元素
)

结果:

{ "_id" : 1, "grades" : [ 85, 82, 80 ] }
{ "_id" : 2, "grades" : [ 88, 90, 92 ] }
{ "_id" : 3, "grades" : [ 85, 100, 90 ] }

###2、$[]数组元素占位符
例子:

{ "_id" : 1, "grades" : [ 85, 82, 80 ] }
{ "_id" : 2, "grades" : [ 88, 90, 92 ] }
{ "_id" : 3, "grades" : [ 85, 100, 90 ] }

操作 :

db.students.update(
   { },  #匹配所有
   { $inc: { "grades.$[]": 10 } }, #数组内所有元素减10
   { multi: true }
)

结果:

{ "_id" : 1, "grades" : [ 95, 92, 90 ] }
{ "_id" : 2, "grades" : [ 98, 100, 102 ] }
{ "_id" : 3, "grades" : [ 95, 110, 100 ] }

###3、$[< identifier>] 匹配条件占位符
例子:

{ "_id" : 1, "grades" : [ 95, 92, 90 ] }
{ "_id" : 2, "grades" : [ 98, 100, 102 ] }
{ "_id" : 3, "grades" : [ 95, 110, 100 ] }

运算:



db.students.update(
   { },
   { $set: { "grades.$[element]" : 100 } },  #声明使用element过滤器
   { multi: true,
     arrayFilters: [ { "element": { $gte: 100 } } ]  #过滤器
   }
)


结果:

{ "_id" : 1, "grades" : [ 95, 92, 90 ] }
{ "_id" : 2, "grades" : [ 98, 100, 100 ] }
{ "_id" : 3, "grades" : [ 95, 100, 100 ] }

###4、$addToSet数组元素添加运算符
例子:

{ _id: 1, item: "polarizing_filter", tags: [ "electronics", "camera" ] }

运算:

db.inventory.update(
   { _id: 1 },
   { $addToSet: { tags: "accessories" } }
)

###5、$pop删除数组元素运算符

例子:

{ _id: 1, scores: [ 8, 9, 10 ] }

运算:

//删除第一个
db.students.update( { _id: 1 }, { $pop: { scores: -1 } } )

//删除最后一个
db.students.update( { _id: 1 }, { $pop: { scores: 1 } } )

###6、$pul删除匹配的数组元素

例子:

{
   _id: 1,
   fruits: [ "apples", "pears", "oranges", "grapes", "bananas" ],
   vegetables: [ "carrots", "celery", "squash", "carrots" ]
}
{
   _id: 2,
   fruits: [ "plums", "kiwis", "oranges", "bananas", "apples" ],
   vegetables: [ "broccoli", "zucchini", "carrots", "onions" ]
}

运算:

db.stores.update(
    { },//删除一下匹配到的数组元素
    { $pull: { fruits: { $in: [ "apples", "oranges" ] }, vegetables: "carrots" } },
    { multi: true }  
)

结果:

{
  "_id" : 1,
  "fruits" : [ "pears", "grapes", "bananas" ],
  "vegetables" : [ "celery", "squash" ]
}
{
  "_id" : 2,
  "fruits" : [ "plums", "kiwis", "bananas" ],
  "vegetables" : [ "broccoli", "zucchini", "onions" ]
}

###7、向数组添加元素

例子:

db.students.update(
   { _id: 1 },
   { $push: { scores: 89 } }
)

运算:

db.students.update(
   { name: "joe" },
   { $push: { scores: { $each: [ 90, 92, 85 ] } } }
)

###8、$pullAll删除数组中匹配到的所有元素
例子:

{ _id: 1, scores: [ 0, 2, 5, 5, 1, 0 ] }

运算:

db.survey.update( { _id: 1 }, { $pullAll: { scores: [ 0, 5 ] } } )

结果:

{ "_id" : 1, "scores" : [ 2, 1 ] }

###9、$each配合push和addToSet运算符向数组中添加多个元素

db.students.update(
   { name: "joe" },
   { $push: { scores: { $each: [ 90, 92, 85 ] } } }
)

###10、$position配合push运算符将元素添加到数组指定位置

例子:

{ "_id" : 1, "scores" : [  50,  60,  70,  100 ] }

操作:

db.students.update(
   { _id: 1 },
   {
     $push: {
        scores: {
           $each: [ 20, 30 ],
           $position: 2
        }
     }
   }
)

结果:

{ "_id" : 1, "scores" : [  50,  60,  20,  30,  70,  100 ] }

###11、$slice限制push运算数组大小

例子:

{ "_id" : 1, "scores" : [ 40, 50, 60 ] }

运算:

db.students.update(
   { _id: 1 },
   {
     $push: {
       scores: {
         $each: [ 80, 78, 86 ],
         $slice: -5    //只保留最后五个
       }
     }
   }
)

结果:


{ "_id" : 1, "scores" : [  50,  60,  80,  78,  86 ] }

###12、$sort配合push从新排序数组
例子:

{
  "_id": 1,
  "quizzes": [
    { "id" : 1, "score" : 6 },
    { "id" : 2, "score" : 9 }
  ]
}

运算:

db.students.update(
   { _id: 1 },
   {
     $push: {
       quizzes: {
         $each: [ { id: 3, score: 8 }, { id: 4, score: 7 }, { id: 5, score: 6 } ],
         $sort: { score: 1 }
       }
     }
   }
)

结果:

{
  "_id" : 1,
  "quizzes" : [
     { "id" : 1, "score" : 6 },
     { "id" : 5, "score" : 6 },
     { "id" : 4, "score" : 7 },
     { "id" : 3, "score" : 8 },
     { "id" : 2, "score" : 9 }
  ]
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值