MongoDB更新文档分为两大类:文档替换,使用新文档完全替换掉旧文档

修改器,修改部分文档

文档替换

使用文档替换非常的简单,下面来看演示:$collect->insertOne(['name' => 'lakers', 'nums'=> 16]);

$collect->replaceOne(

['name'=>'lakers'],

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

);

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

"$set"修改器

"$set"用来指定一个字段的值。如果这个字段不存在,则创建它。$collect->insertOne([

'name' => 'james',

'age' => 35,

]);

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

['$set' => ['fruit' => 'apple']]

);

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

如果现在不喜欢apple,想换成草莓$collect->updateOne(['name'=>'james'],

['$set' => ['fruit' => 'strawberry']]

);

"$set"还可以修改键的类型。# 不止喜欢草莓,还喜欢梨子、香蕉。

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

['$set' =>

['fruit' =>

['strawberry', 'banana', 'pear']

]

]

);

"$set"也可以修改内嵌文档$collect->insertOne([

'name' => 'james',

'age' => 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'=>'james'],

['$inc' =>

['scores' => 61]

]

);

## 现有积分61

现在,有获得了10点积分。$collect->updateOne(['name'=>'james'],

['$inc' =>

['scores' => 10]

]

);

## 现有积分71

后来,用掉了50积分$collect->updateOne(['name'=>'james'],

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

] );

## 现有积分21

数组修改器

MongoDB针对数组提供了专门的修改方法。

"$push"添加元素

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

'_id' => 1,

'title'=>'study mongodb',

'create_time' => '2020-08-24 12 :31'

]);

$push = ['$push' => ['comments' => 'comments1'] ];

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

"$each"添加多个元素

'$push'可以一次数组元素,如果想一次添加多个元素的话,则需要搭配使用'$each'。$push = [

'$push' =>

['comments' =>

['$each' => ['comment1', 'comment2', 'comment3']]

]

];

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

"$slice"保留n个元素

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

> db.users.find()

{ "_id" : 1, "title" : "study mongodb", "create_time" : "2020-08-24 12:31", "comment" : [ "comment1", "comment2", "comment3", "comment4", "comment5", "comment6" ] }$push = [

'$push' => [

'comment' => [

'$each' => ['comment7', 'comment8', 'comment9'], '$slice' => -3

],

],

];

$collect->updateOne(['_id' => 1 ], $push);# 现数据如下

db.users.find()

{ "_id" : 1, "title" : "study mongodb", "create_time" : "2020-08-24 12:31", "comment" : [ "comment7", "comment8", "comment9" ] }

"$sort"排序

还可以配合'$sort'使用,保留点赞数最多的3条评论。# 目前是集合内是空的,么有任何文档

$collect->insertOne(['_id' => 1, 'title'=>'study mongodb', 'create_time' => '2020-08-24 12:31']);

$push = [

'$push' => [

'comment' => [

'$each' => [

['comment' => 'php', 'like' => 100],

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

['comment' => 'linux', 'like' => 200],

['comment' => 'java', 'like' => 1000],

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

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

],

'$slice' => -3,

'$sort' => ['like' => 1]

],

],

];

再来看看集合内数据是怎样的:> db.users.find()

{ "_id" : 1, "title" : "study mongodb", "create_time" : "2020-08-24 12:31", "comment" : [ { "comment" : "nginx", "like" : 300 }, { "comment" : "composer", "like" : 500 }, { "comment" : "java", "like" : 1000 } ] }

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

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

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

'_id' => 1,

'name' => 'gwx',

'age' => 30,

'fruits' => ['apple', 'pear']

]);

$update = [

'$addToSet' => [

'fruits' => 'apple'

]

];

上面的修改不会成功,因为apple已经存在。'$addToSet'也可以和"$each"配合使用,插入多个数组元素。$update = [

'$addToSet' => [

'fruits' => [

'$each' => ['apple', 'banana', 'orange']

]

]

];

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

删除元素

可以通过"$pop",删除最左端或最右端的元素。$collect->insertOne([

'_id' => 1,

'name' => 'gwx',

'age' => 30,

'fruits' => ['apple', 'pear']

]);

#从数组末删除1个元素

$update = [

'$pop' => [

'fruits' => 1

]

];

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

# 从数组头删除一个元素

$update = [

'$pop' => [

'fruits' => -1

]

];

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

还可以通过'$pull'删除指定的元素$collect->insertOne([

'_id' => 1,

'name' => 'gwx',

'age' => 30,

'fruits' => ['apple', 'pear', 'apple', 'banana', 'orange']

]);

#从数组末删除

$update = [

'$pull' => [

'fruits' => 'apple'

]

];

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

upsert

upsert是一种特殊的更新。但找到符合条件的集合,那么和之前的修改时一样的。若没有找到符合条件的集合,那么它就会以查询条件以及修改的文档作为一个新文档插入到集合中。

下面,以一个我们经常碰到的场景来举例——记录每个ip浏览的次数。若是新的ip,则新增到集合中,若已存在,就修改原有集合。$collect->updateOne(['ip' => '116.31.23.1'], [

'$inc' =>[

'views' => 1

]

], ['upsert' => true]);

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

'$inc' =>[

'views' => 1

]

], ['upsert' => true]);

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

'$inc' =>[

'views' => 1

]

], ['upsert' => true]);> db.users.find()

{ "_id" : ObjectId("5f4336f3a95f1a505db9a2df"), "ip" : "116.31.23.1", "views" : 2 }

{ "_id" : ObjectId("5f4336f3a95f1a505db9a2e1"), "ip" : "127.0.0.1", "views" : 1 }

更新多个文档

更新多个文档需要使用updateMany()方法,演示如下:$collect->insertMany([

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

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

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

]);

$collect->updateMany([

'name' => 'gwx'

],

['$set' =>['age' => 18]]

);

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

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

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

  2. mongodb查询内嵌文档

    mongodb查询内嵌文档 假设有这样一个文档: db.XXX.remove(); db.XXX.insert({"id":1, "members":[{&qu ...

  3. mongodb 查询内嵌文档

    原文:http://www.cnblogs.com/silentjesse/p/3598399.html mongodb查询内嵌文档 假设有这样一个文档: db.XXX.remove(); db.XX ...

  4. word、excel文档内容更新技术方案

    需求背景 惯例先说下背景. 生产.研发业务上往往使用大量word和excel文档来作为资料载体,如操作规程.控制手册.卡片--,这些文档会反复使用到一些设备.工艺等参数数据.参数属性主要是名称.编码. ...

  5. Elastic Search创建文档和更新文档

    Elastic Search创建文档和更新文档(Put && Update) 在平时的es中需要对文档创建或者更新,通常情况下有2种api实现,举例如下: 第1种:PUT /testi ...

  6. oracle查看jdk文档_Oracle JDK 9 Early Access文档已更新

    oracle查看jdk文档 Raymond Gallardo于2017年4月4日发布的针对Oracle JDK 9的抢先 访问文档已更新,今天宣布对Oracle JDK9文档的抢先访问页面进行了更新. ...

  7. Oracle JDK 9 Early Access文档已更新

    Raymond Gallardo在2017年4月4日发布的针对Oracle JDK 9的抢先体验文档 已更新,今天宣布对Oracle JDK9文档的抢先体验页面进行了更新. Gallardo重点介绍了 ...

  8. jQuery基础文档(持续更新)

    文章目录 jQuery基础文档(持续更新) 1 jQuery入门仪式: jQuery基础文档(持续更新) 1 jQuery入门仪式: 还是先上一段代码吧,对照这看: <!DOCTYPE html ...

  9. 单车管理系统——1.文档设计及sql代码说明

    SQL server 设计 目录: 1.各个表的建立 2.级联操作 3.触发器和存储过程 4权限管理 注:由于表比较多,sql语句很长,所以下面的说明中每样只举一个或两个例子, 1.各个表的建立 表1 ...

最新文章

  1. RxPermission原理解析
  2. 非等高cell实战(01)-- 实现微博页面
  3. matlab启动不了jvm,MATLAB ::在-nojvm启动选项下不再支持此功能
  4. Spring Boot文档阅读比较-@SpringBootApplication Auto Configuration
  5. Java编程实现静态多态,java基础--多态-域与静态方法1(java编程思想)
  6. 为什么手机升级系统反应慢了_手机卡顿反应慢怎么解决?久用不卡顿的手机盘点...
  7. .svn文件夹_SVN下载安装及使用教程(二)
  8. Linux的shell编程(二)
  9. 为什么每个邮件收到后都会有一个htm的附件_Python3.x 发送各种形式的告警邮件内容...
  10. MFC编程入门之十(对话框:设置对话框控件的Tab顺序)
  11. Node.js验证码模块captchapng
  12. android rom制作教程,【图片】ROM助手:任意安卓机型的ROM制作教程【a298t吧】_百度贴吧...
  13. 【DevOps】SVN分支操作快速入门
  14. 二元函数极限知识点总结
  15. IP营销要从内部打破小众圈层的壁垒,“内容+社交”必不可少
  16. PostgreSQL 磁盘空间清理
  17. 枯燥的寒假生活(二) 武汉大学老教务系统提交表单时的密码加密方式
  18. 计算机金融专业排行榜,2020金融学专业大学排名 中国金融专业大学100强
  19. MATLAB:零状态响应(lsim(连续);filter(离散))、冲激响应(impulse或impz)和阶跃响应(step)、卷积(conv)
  20. JS检测客户端软件是否安装

热门文章

  1. Luogu P1550 [USACO08OCT]打井Watering Hole
  2. 缺少编译器要求的成员“System.Runtime.CompilerServices.ExtensionAttribute..ctor” 解决方案...
  3. 极路由4pro(HC5962)设置阿里云DDNS
  4. 听云数据库管理平台NetopGO简介
  5. [转]微软代码示例:ASP.NET 2.0 三层架构应用程序教程系列
  6. 0-10不断循环的js
  7. SQL中关于EXISTS谓词的理解
  8. c语言115写成16进制,西安电子科技大学计算机导论与C语言程序设计 计算机文化概论.pdf...
  9. CCF201409-2 画图
  10. PostgreSQL用户登录失败自动锁定的解决办法