MongoDB 常用更新运算符

2023-02-16 06:40:19 阅读:1174 评论:0 点赞:0
所属分类: MongoDB

一、基本用法

以下修饰符可用于更新操作,例如,db.collection.updateMany()db.collection.findAndModify(),更新文档语法格式:

{
   <operator1>: { <field1>: <value1>, ... },
   <operator2>: { <field2>: <value2>, ... },
   ...
}

二、常用运算符

5.0 版本开始,处理字段顺序按照字典字段名称排列顺序,有数字名称的按数字顺序处理。在 4.4 以前版本是按照字典排列顺序处理。

{$set: {"a.2": <new value>, "a.10": <new value>,}}

2.1 字段操作

名称 描述
$currentDate 将字段值设置为当前日期,日期或者时间戳
$inc 字段值自增多少
$min 更新值小于字段值则更新
$max 更新值大于字段值则更新
$mul 当前字段 *= 指定的值
$rename 重命名字段
$set 设置文档字段值
$setOnInsert 更新不存在的文档时,指定插入文档某些字段的默认值
$unset 删除字段

2.3 数组操作

名称 描述
$ 占位符,表示查询条件匹配到的第一个元素
$[] 占位符,查询条件匹配的所有元素
$[<indentifier>] 占位符,更新满足条件的所有元素,indentifier 用于表示 arrayFilters 的匹配规则名称。
$addToSet 数组中不存在时才添加
$pop 删除数组第一个或最后一个元素
$pull 删除满足条件的所有元素
$push 添加到数组
$pullAll 从数组中删除所有匹配的值。

修饰运算符

名称 描述
$each 指定 $push$addToSet 追加的元素列表
$position 指定 $push 时元素添加位置
$slice 限制数组大小,0 表示空数组,大于 0 表示保留前面 N 个元素,小于0 表示保留后面 N 个元素
$sort 对数组按指定字段重新排序

2.4 位运算

名称 描述
$bit 执行整数值的按位AND,OR,XOR更新。

三、示例

3.1 $currentDate

将字段更新为当前日期

{$currentDate: {field: true}}
// {$set: { lastModified: "$$NOW"}}

3.2 $inc

将字段值增加指定量

db.products.updateOne(
   { sku: "abc123" },
   { $inc: { quantity: -2, "metrics.orders": 1 } }
)

3.3 $min

若更新值低于元素值,则更新

db.scores.updateOne( { _id: 1 }, { $min: { lowScore: 150 } } )
// 若原始值 lowScore 高于 150,则更新为 150

3.4 $max

若更新值大于原始值,则更新

db.scores.updateOne( { _id: 1 }, { $max: { highScore: 950 } } )
// 若原始值 highScore 低于 950,则更新为 950

日期也可以进行比较

db.tags.updateOne(
   { _id: 1 },
   { $max: { dateExpired: new Date("2013-09-30") } }
)

3.5 $mul

将字段的值乘以一个数字后再更新

db.products.updateOne(
   { _id: 1 },
   { $mul:
      {
         price: Decimal128( "1.25" ),
         quantity: 2
       }
   }
)

3.6 $rename

修改字段名

db.students.updateOne(
   { _id: 1 },
   { $rename: { 'nickname': 'alias', 'cell': 'mobile' } }
)

若能重命名字段不存在,不执行任何操作。

3.7 $set

db.products.updateOne(
   { _id: 100 },
   { $set:
      {
        quantity: 500,
        details: { model: "2600", make: "Fashionaires" },
        tags: [ "coats", "outerwear", "clothing" ]
      }
   }
)

3.8 $setOnInsert

如果更新操作导致插入文档,则将指定的值分配给文档中的字段。如果 更新操作不会导致插入,不执行任何操作。

db.products.updateOne(
  { _id: 1 },
  {
     $set: { item: "apple" },
     $setOnInsert: { defaultQty: 100 }
  },
  { upsert: true }
)

3.9 $unset

运算符删除特定字段。

db.products.updateOne(
   { sku: "unknown" },
   { $unset: { quantity: "", instock: "" } }
)
// 删除字段: quantity,instock

3.10 数组更新($)运算符

$ 标识要更新数组中元素的位置,不需要显示指定

// 测试数据
db.students.insertMany( [
   { "_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 },
   { $set: { "grades.$" : 82 } }
)
// 更新后
{ "_id" : 1, "grades" : [ 85, 82, 80 ] }
{ "_id" : 2, "grades" : [ 88, 90, 92 ] }
{ "_id" : 3, "grades" : [ 85, 100, 90 ] }

标识将 grades 数组中第一个元素值为80的更新为82。$ 这里标识要第一个满足更新条件元素的下标位置。

提示

若更新的数组元素是文档,可以使用 {array.$.field: value} 的形式进行更新。

3.11 数组更新($[])运算符

$[]$ 一样也是位置占位符,不同的是 $[] 表示所有满足更新条件的元素,而 $ 仅表示第一个。

db.collection.updateOne(
   { myArray: [ 5, 8 ] },
   { $set: { "myArray.$[]": 10 } },
   { upsert: true }
)

该操作将把所有满足条件的文档中的 myArray 数组中元素值为 5 和 8 的都更新为 10。

db.students.updateMany(
   { },
   { $inc: { "grades.$[]": 10 } },
)

表示把所有满足条件的文档中的 grades 数组中的所有元素自增 10。

3.12 数组更新筛选占位运算符

$[<identifier>] 该运算符叫筛选占位符,用于表示满足筛选条件的元素,配合 arrayFilters 使用。

db.collection.updateOne(
   { myArray: [ 0, 1 ] },
   { $set: { "myArray.$[element]": 2 } },
   { arrayFilters: [ { element: 0 } ], upsert: true }
)

element 表示筛选规则名称,表示 arrayFilters 筛选出需要更新的元素。嵌套数组的更新:

db.students4.updateMany(
   {},
   { $inc: { "grades.$[t].questions.$[score]": 2 } },
   { arrayFilters: [ { "t.type": "quiz" }, { "score": { $gte: 8 } } ] }
)

3.13 数组更新($addToSet)运算符

向数组中添加一个值,若该值已存在不执行任何操作。

db.pigments.updateOne(
   { _id: 1 },
   { $addToSet: { colors: "mauve" } }
)

3.14 数组更新($poo)运算符

删除数组中第一个或者最后一个元素:

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

3.15 数组更新($pull)运算符

$pull 将删除多个匹配的元素:

db.stores.updateMany(
    { },
    { $pull: { fruits: { $in: [ "apples", "oranges" ] }, vegetables: "carrots" } }
)

$in 删除多个,单个直接写在后面。或者直接删除满足条件的元素:

db.profiles.updateOne( { _id: 1 }, { $pull: { votes: { $gte: 6 } } } )

3.16 数组更新($push)运算符

$push 向数组追加元素

// 追加单个
db.students.updateOne(
   { _id: 1 },
   { $push: { scores: 89 } }
)
// 追加多个
db.students.updateOne(
   { name: "joe" },
   { $push: { scores: { $each: [ 90, 92, 85 ] } } }
)
// 指定位置追加元素
db.students.updateOne(
   { _id: 1 },
   {
     $push: {
        scores: {
           $each: [ 50, 60, 70 ],
           $position: 0
        }
     }
   }
)
// 追加后排序,并现在保留个数
db.students.updateOne(
   { _id: 5 },
   {
     $push: {
       quizzes: {
          $each: [ { wk: 5, score: 8 }, { wk: 6, score: 7 }, { wk: 7, score: 6 } ],
          $sort: { score: -1 },
          $slice: 3
       }
     }
   }
)
// $slice=0,空数组,$slice>1保留前面三个,$slice<1保留最后面3个。

3.17 数组更新($pullAll)运算符

$pullAll 删除指定元素:

db.survey.updateOne( { _id: 1 }, { $pullAll: { scores: [ 0, 5 ] } } )
// 元素为0或者5的都会被删除

永不言弃

职业:后端开发工程师
学校:重庆师范大学
城市:重庆
文章:169
好吧,不知道说点什么...

登录逐梦笔记

注册逐梦笔记

已有账号?