MongoDB更新文档分为两大类:

文档替换,使用新文档完全替换掉旧文档

修改器,修改部分文档

文档替换

使用文档替换非常的简单,下面来看演示:

$collect->insertOne(['name' => 'lakers', 'nums'=> 16]);

$collect->replaceOne(

['name'=>'lakers'],

['name' => 'heat', 'nums'=>3]

);

使用修改器可以完成更复杂的更新操作,比如修改、增加或删除键。

"$set"修改器

"$setX C e 4"用来指定一个字段的值。如果这个字段不存在,则创建它。

$coll^ P Q k + w k P &ect->insertOne([

'name' => 'james',

'age' => 35,

]);

$collect->updateOne(['name'=&gtD s v 3 g;'james'],

['$s~ f B : . 3 7et' => ['0 L 2 V R M ofruit' => 'apple']]

);

// fruit字段不存在,则会创建该字段

如果现在c J ] . R + k _不喜欢apple,想4 x y ~换成草莓

$collect->updateOne(['name'=>'james'],

['$set' => ['fruit' =&E T L u m z * =gt; 'strawberry']]

);

"$set"还可以修改键的类型。

# 不止喜欢草莓,还喜欢梨子、香蕉。

$collect->updateOne(['name'4 6 [ M A P e U=>'james'],

['$set' =>

['fruit' =>

['sN P H # $ #trawberry',2 q R L . & V 8 'banana', 'pear']

]T 6 m % j

]

);

"$set"也可以修改内嵌文档

$colJ , Q e S u ( qlect->insertOne([

'namm d s D a 8 o W %e' => 'james',

'age' =&g) 9 5 + , Y b 6 8t; 35,

'brothers' => ['name' => 'wade', 'age'=> 38]

]);

$collect->updateOne(['name'=>'james'],

['$set' =>

['brothers.name' => 'paul']

]

);

"$unset"修改器

使用"$unset"修改器可以删除指定字段

$collect->updateOne(['name'=>'james'],

['$unset' =>

['brothers' => '']

]

);

"$inc"修改器,增加或减少数值

和"$set"修改器一样,如果该字段不存在则自动创建。注意:该字段值只可以是数字。

$collect->updateOne(['name'=>'j^ L S F . 9 a kames'o } h Y],

['$inc' =>

['scores' => 61]

]

);

## 现有积分61

现在,有获得了10点积分。

$collect->updateOne(['name'=>'james'],

['$inc' =&gn u S : 8 / * T 1t;

['scores' => 10]

]

);

##c 6 E q 现, 1 v Y r有积分71

后来,用掉了50积分

$collect->updateOne(['name'=>'james'],

['$inc' =>['scores' => -50]

] );

## 现有v r } y积分21

数组修改器

MongoDBp J 4 d R @ k )针对数组提供了专门的修改方法。

"$push"添加元素

"$push"可以往数组里添加元素,如果该数组不存在,则会自动创建数组。现在有一个文档用于保存文章数据:

$com K Jllect->insertOne([

'_id' => 1,

'title'=>'study mongodb',

'create_time' => a 9 j U l 4'2020-08-24 12 :31'

]);

$7 o s 9 u B G _push = ['$push' => ['comments' => 'comments1'] ];

$collect->updateOne(['_id' => 1 ], $push);

"$each"添加多个元素

'$push'可以一次数组元素,如果想一次添加J v 0 | ! k f 0多个元素的话,则需要搭配使用'$each'。

$push = [

'$push' =>

['comments' =>

['$each' => ['commen7 T * H ; b o :t1', 'comment2', h Y [ 7 c W ? t'comment3']]

]

];

$collect->updateOne(['_id' => 1 ], $push);

"$slice"保留n个元素

'$push'和'$slicet'配合使用,保留最新C b $的n条数据,'$slice'的值只能是负整数。比如,我只想保留最新的3条评论:

# 目前数据如下

> db.users.find()

{/ Z 4 K "_id" : 1, "title" : Q 0 w 8 T C V L h"study mongodb", "creu Y w f +ate_time" : "2020-08-24 12:31", "comment" : [ "comment1", "comment2", "comment3", "comment4", "comment5", "comment6" ] }

$pus* B 8 U 0h = [

'$pu, 0 # /sh' =&g@ 1 4 a n m N it; [

'comment' => [

'$each' =&gx N 7 e + gt; ['comment7', 'comment8'T q b A, & , ; 7'comm9 { Tent9'], '$sliceG g 9' => -3

],

],

];

$collect->updateOne(['_id' => 1 ], $push);

# 现数据如下

db.usX 2 H % Sers.find()

{ "_id" : 1, "title" : "study mongodb", "create_time" : "2020-08-24 12:31X . 1 A J ! , 1", "comment" : [ "comment7", "comment# o ] v H ! n8", "comment9" ] }

"$sort"排序

还可以配合'$sort'使用,保留点赞数最多的3条评论。

# 目前是集合内是空的,么有任何文档

$collect->insertOne(['_id' =A # ) ] j a { e> 1, 'title'=>'study mongodb', 'create_ti8 j qme' => '2020-08-24 12:31']);

$push = [

'$push' => [

'comment' => [

'$each' => [

['comment' => 'php', 'like' =&N ^ | Z 5gt; 100],

['comment' => 'mysql', 'like' => 10],

['comment' => 'lin? [ p - H Y `ux', 'like' => 200],

['comm4 ! / y _ 0ent' => 'java', 'like' => 1000],

['comment' => 'nginx', 'like' => 300],

['comment' => 'composer', 'like' => 500],

],

'$slice' => -3,

'$sort' =&gg 9t; ['like' => 1]

],

],

];

再来看看集合内数据是怎样的:

> db.user0 ^ ? g o I M 8 Ws.find()

{ "_id" : 1, "title" : "study mongodb", "create_time" : "2020-08-24 12:31", "comme& 4 5 = ? a + 2 snt" : [ { "comment" :L m 3 8 r "nginx0 T h [", "like" : 300 }, { "comment" : "D h =composer", "like" : 500 }, { "comment" : "java", "like" : 1000 } ] }

注} l 4意不能只将 "$slice" 或者 "$sort" 与 "$push" 配合使用,且必须使用 "$each"。

"$addToSet"避免插入重复数据

使用"$addToSet"新增数组元素时,可以避免添加重复数据,比如

$collect->insertOne([

'_id' => 1,

'name' => 'gwx',

'age' =&gt0 ? b $ 4 0 & ,; 30,

'fruits' => ['aQ G N S Q O % -pple', 'pear']

]);

$update = [

'$addToSet' => [

'fruits' => 'apple'

]

];

上面的修改不会成功,因为appl5 o 2 te已经- ( 4 C x存在。'$addTS A w xoSet'也可以和"$each"配合使用,插入多[ j o A _个数组元素。

$update = [

'$addToSet' => [

'fruits' => [

'$each' =&gt$ @ } ~ T; ['apple', 'banana', 'orange']

]

]

];

$collect->updateOne(['_id' => 1], $update);

删除元素

可以通过"$pop",删除最左端或最右端的元素9 a V 7 d。

$collect->insertOne([

'_id' => 1,

'name' => 'gwx',

'age' => 30,

'frc y p 1 V , q 7uits' => ['apple', 'pear']

]% 6 v u B ! 0 H);

#从数& E G H 8 n p k组末删除1个元素

$update = [

'$pop' => [

'fruits' => 1

]

];

$collect->/ / S w , % 4updateOne(['_id' => 1], $updatee S ^ 5 t t u w);

# 从数组头删除一个元素

$update = [

'$pop' => [

'fruiW , k : K S ` gts' => -1

]

];

$collect->up5 9 #dateOne(['_id' => 1], $update);

还可以通过'$pull'删除指定的元素

$collect->insertOne(i e | T[

'_id' => 1,

'name' => 'gwx',

'age' => 30,

'fruits' => ['app~ 2 r r p r rle', 'pear', 'apple', 'banana', 'orange']

]);

#从数组末删除

$update = [

'$pull' => [

'fruits' => 'apple'

]

];

数组有所有apple元素都被删除了

ug 5 A ! R } npsert

upsert是$ ) A 4 - p一种特殊的更新。但找到符合条件的集合,那么和之前的修改时一样的。若没有找到符合条件的集合,那么它就P K L c d * ~会以查询条件以及修改的文档作为一个w y 1 L新文档插入到集合中。

下面,以一个我们经常碰到的场景来举例——记录每个ip浏览的次数。若是新的ip,则新增到集合中,若已存在,就修改原有集合。D h [ 6 [ %

$collect->updateOne(['ip' => '116.31.23.1'], [

'$inc' =>[

'views' => 1

]

]c 3 * ] l, ['upsert' => true]);

$collect->updateOne(['ip' => '12@ = r t ] y L w7.0.0.1'], [

'$iD { $ M ? b #nc' =>[

'views' => 1

]

], ['upsert( T Z v' =>S p X j trueE * 5]);

$collect->updateOne(['ip3 n L @ H' =>2 2 L J [ '116.31.23.1'], [

'$inc' =>[

'views' => 1

]

], ['upseZ w 4 trt' => true]);

> db.users.find()

{ . _ ] e D"_id" : ObjectId("5f4336f3a95f1a505db9a2df"), "ip" : "1f [ o ] _ Q +16.31.23.1", "views" : 2 }

{ "_id~ g h U z" : ObE O c N ` ]jectId(X C | L & x * g"5f4336f3a95f1a505db9a2e1"), "ip" : "127.0.0.1", "views" : 1 }

更新多个文档

更新多个文档需要使用updateMany()方法,演示如下:

$collect->ir * n unsertMany([

['name' =>e N ^ 9 3 $ } O 'gwx', 'age' => 30],

['name' => 'gwx', 'age' => 30],

['name' =c ^ x ~ o / k ) 0> 'gwx', 'age' => 30],

]);

$collect->updateMaN & l U W C f Jny([

'name' => 'gwx'

],

['$set' =>['age' =L y C>z z m u P 1O J l ~8]]

);

以上就是MongoDB文~ u $ f A Y档的更新(php代码实~ _ ; H R s例)的详细内容。

mongodb php代码实例,MongoDB文档的更新(php代码实例)相关推荐

  1. mongodb php update,MongoDB文档的更新(php代码实例)

    MongoDB更新文档分为两大类:文档替换,使用新文档完全替换掉旧文档 修改器,修改部分文档 文档替换 使用文档替换非常的简单,下面来看演示:$collect->insertOne(['name ...

  2. mongodb 输出数组字段_MongoDb文档操作、索引操作

    学习主题:MongoDb 学习目标: 掌握mongodb文档的更新 掌握mongodb文档的删除 掌握mongodb文档的查找 掌握mongodb文档的条件操作符 掌握mongodb中的索引操作 Mo ...

  3. MongoDB查询集合中的文档

    MongoDB查询集合中的文档 参考资料:http://blog.csdn.net/qq_36040184/article/details/54355085 测试: 集合中插入数据 > db.c ...

  4. Jsoup解析HTML实例及文档方法详解

    转载自  Jsoup解析HTML实例及文档方法详解 这篇文章主要介绍了Jsoup如何解析一个HTML文档.从文件加载文档.从URL加载Document等方法,对Jsoup常用方法做了详细讲解,最近提供 ...

  5. 如何用java代码给Word文档添加水印?

    为防止非法使用.定义所有权.显示文档状态等多种目的,在 Word 文档中添加水印.在本文中,您将学习如何使用 Java 为 Word 文档添加水印.文章将分别演示如何将文字和图片水印插入到Word文档 ...

  6. python对excel数据求和_python对excel文档去重及求和的实例

    废话不多说,估计只有我这个菜鸟废了2个小时才搞出来,主要是我想了太多方法来实现,最后都因为这因为那的原因失败了 间接说明自己对可变与不可变类型的了解,还是不够透彻 最后就用了个笨方法解决了! #cod ...

  7. 先写API文档还是先写代码?你需要这款神器Apifox!

    代码未动,文档先行 其实大家都知道 API 文档先行的重要性,但是在实践过程中往往会遇到很多困难. 程序员最讨厌的两件事:1. 写文档,2. 别人不写文档.大多数开发人员不愿意写 API 文档的原因是 ...

  8. Python 操作Word文档插入图片和表格实例演示

    Python 操作Word文档插入图片和表格实例演示 效果图 实现过程 ① python-docx 库安装 ② word 文档插入图片演示 ③ word 文档插入表格演示 [ 文章推荐 ] Pytho ...

  9. xml文档包含html代码_为什么文档很重要,以及为什么应将其包含在代码中

    xml文档包含html代码 There are a plethora of acronyms when it comes to software development. KISS, DRY, SOL ...

最新文章

  1. windows系统下的FTP命令
  2. java jni demo_Android JNI:让你一眼知之的JNI DEMO
  3. 上海交通大学乐经良高数手写笔记-一元积分学
  4. Nova 组件详解 - 每天5分钟玩转 OpenStack(26)
  5. 腾讯网易已称王,今日头条有什么勇气来做游戏?
  6. cloud 调用列表并返回数据操作代码
  7. SQL基础知识总结二
  8. 政企用户网络安全常见风险盘点
  9. java ITEXT实现PDF生成二维码和条形码
  10. 什么是API Mock测试?
  11. 推荐一组用过好几年的非常稳定的dns
  12. 如何进行高效学习——费曼技巧了解一下
  13. /boot空间不足的解决办法
  14. 树的遍历(先序、中序、后序详解)
  15. 算法工程师面试之OOV问题如何解决?
  16. 【目标检测·yolo系列】YOLOV1目标检测论文(参考 同济子豪兄的解读)笔记
  17. python死循环用什么好弄_用python死循环
  18. 【Pandas 数据查找函数 详解】
  19. windows 计算器
  20. 中国数字视听行业全景调研与投资趋势预测报告

热门文章

  1. 17原理图查找连接的管脚接口_第三节 主板原理图之标识的作用
  2. 【多线程】0.理解一下5种IO模型、阻塞IO和非阻塞IO、同步IO和异步IO
  3. Caffe学习系列(3):视觉层(Vision Layers)及参数
  4. Nodejs开源项目推荐
  5. 类加载机制-双亲委派,破坏双亲委派--这一篇全了解
  6. 类加载器的双亲委派及打破双亲委派
  7. 使用AOP与注解记录Java日志
  8. 原来小清新色调是这样调出来的~
  9. 中国计算机学会CCF推荐国际学术会议和期刊目录-交叉/综合/新兴
  10. 深度学习(二十一)基于FCN的图像语义分割-CVPR 2015-未完待续