mongodb update

update(filter,update,options)
  • 参数filter用于指定一个查询,查询选择将要更新的目标记录。
  • 参数update用于指定更新信息,也可以使用操作符来完成。
  • 参数options用于指定更新文档时的选项,可选值包括:upsert和multi。upsert可以指定如果数据存在就更新,不存在就创建数据;multi选项指定是否应该更新所有匹配的文档,或者只更新第一个文档(默认行为)。

更新操作符

  • 覆盖更新 任何忽略的字段都被移除(文档被覆盖)
update : {} 不适用操作符
  • 不存在时新增
options : {upsert:true}
  • $inc 增加新值
update : {$inc:{<field1>: <value1>,...}
  • $set 设置字段值
update : {$set:{<field1>: <value1>,...}
  • $unset 删除指定字段值
update : {$unset:{<field1>: <value1>,...}
  • $rename 修改字段名
update : {$rename: { <field1>: <newName1>, <field2>: <newName2>, ... } }
  • $min,$max 数值比较 true更新,false不更新
update : { $min: { <field1>: <value1>, ... } }
update : { $max: { <field1>: <value1>, ... } }
  • $setOnInsert 在{upsert:true}并且触发新增操作时,作为默认值新增
  • $currentDate 当前日期 可设置类型$type date或者timestamp
update : { $currentDate: { <field1>:  {$type: <type>}, ... } }

数组操作符

  • $push 在指定字段中添加某个值

通过$push操作符可以在指定字段中添加某个值。

  1. 如果该字段是个数组,那么该值将被添加到数组中。
  2. 如果该字段尚不存在,那么该字段的值将被设置为数组。
  3. 如果该字段存在,但不是数组,那么将会抛出异常。
  4. 如果给定的值是个数组,那么该数组被看做是一个元素,添加给定字段中(If the value is an array, $push appends the whole array as a single element)。
  5. 使用$each 添加多个值到指定字段
  6. 使用$sort 排序
update : { $push: { <field1>: <value1>, ... } }
  • $push $each 在指定字段插入多个值
update : { $push: { <field>: { $each: [ <value1>, <value2> ... ] } } }

在使用$each是还可以使用$slice修改操作符,通过这种方式可以限制$push操作符中数组内元素的数量。 $slice可以是正数,负数或0。

  1. 正数将保证数组中的前n个元素会被保留
  2. 使用负数将保证数组中的最后n个元素会被保留
  3. 而使用0则表示清空数组

注意:操作符$slice必须是$push操作中的第一个修改操作符。
操作符$each和$slice操作符保证不仅新值会被添加到数组中,还能保证吧数组的大小限制为指定值。

update : { $push: { <field>: { $each: [ <value1>, ... ],$slice:<number> } } }
  • $sort 排序

$sort修改操作符必须与$each修改操作符一起使用。你可以传递一个空数组给$each操作符,这样就可以只使$sort操作符起作用,达到不添加元素,只对原数组排序的目的。

在对数组元素进行排序时,1表示升序,-1表示降序。如果数组元素是文档,我们可以根据整个文档或者是文档中某个具体字段来进行排序。在以前版本中(2.6版本之前)$sort只能根据文档中的具体字段进行排序。假设数组元素是文档,如果只是根据文档中某个字段进行排序,需要使用字段和方向来进行排序,例如, { field: 1 } or { field: -1 },不要使用{ "arrayField.field": 1 }这种方式进行排序。

数组元素不是文档,value1 = <string|number|boolean>
{
  $push: {
     <field>: {
       $each: [ <value1>, <value2>, ... ],
       $sort: <1 or -1>
     }
  }
}
数组元素是文档,value1 = {field:<value>}
{
  $push: {
     <field>: {
       $each: [ <value1>, <value2>, ... ],
       $sort:  { field: <1 or -1> }
     }
  }
}
  • $addToSet 向数组中添加数据

操作符$addToSet 是另一个可用于向数组中添加数据的命令。不过,只有数据不存在的时候,该操作符才能将数据添加到数组中(The $addToSet operator adds a value to an array unless the value is already present, in which case$addToSet does nothing to that array)。它的 工作方式与$push不同,$addToSet确保在添加元素时不会与数组中元素重复($addToSet only ensures that there are no duplicate items added to the set and does not affect existing duplicate elements),但是$push可以添加重复元素。在使用$addToSet时,可以使用$each操作符指定的额外的参数。

如果添加的给定值是个数组,则会把整个数组看做一个元素添加到给定字段中。

update : { $addToSet: { <field1>: <value1>, ... } }
  • $pop 从数组中删除单个元素

操作符$pop可以从数组中删除单个元素。该操作符允许删除数组中的第一个元素或者最后一个元素,具体取决于传入的参数。如果传递的参数为-1表示删除数组第一个元素,1表示删除数组最后一个元素。如果删除的指定字段field不是数组,则会报错。

update: { $pop: { <field>: <-1 | 1>, ... } }
  • $pull 删除所有指定值

通过使用$pull操作符可以从数组中删除所有指定的值或者符合给定条件的值。如果数组中有多个元素的值相同,那么该操作符是非常有用的。

update : { $pull: { <field1>: <value|condition>, <field2>: <value|condition>, ... } }
  • $pullAll删除数组中多个元素

我们还可以从数组中删除多个含有不同值的元素。该操作符将接收一个希望移除元素的数组。不同于$pull,$pull从数组中删除匹配查询条件的数组元素。

update : { $pullAll: { <field1>: [ <value1>, <value2> ... ], ... } }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容