MongoDB save()方法和insert()方法的区别

首先看官方文档怎么说的

Updates an existing document or inserts a new document, depending on its document parameter

save方法有更新和插入两种功能,到底是插入还是更新文档取决于save的参数。那么到底是依赖于哪个参数呢?继续看

If the document does not contain an _id field, then the save() method calls the insert() method. During the operation, the mongo shell will create an ObjectId and assign it to the _id field.

可以看到决定是插入一个文档还是更新,取决于_id参数。如果能根据_id找到一个已经存在的文档,那么就更新。如果没有传入_id参数或者找不到存在的文档,那么就插入一个新文档。

举一个官方的例子

不带_id参数

db.products.save( { item: "book", qty: 40 } )

结果

{ "_id" : ObjectId("50691737d386d8fadbd6b01d"), "item" : "book", "qty" : 40 }

MongoDb客户端驱动会自动为你生成一个默认
ObjectId作为_id。

带_id参数,但是找不到一个已经存在的文档

db.products.save( { _id: 100, item: "water", qty: 30 } )

结果

{ "_id" : 100, "item" : "water", "qty" : 30 }

还是插入一个新文档,但是_id不会自动生成。

带_id参数,但是有存在的文档

db.products.save( { _id : 100, item : "juice" } )

结果

{ "_id" : 100, "item" : "juice" }

更新了文档

总结

  1. insert: 若新增数据的主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常提示主键重复,不保存当前数据。
  2. save: 若新增数据的主键已经存在,则会对当前已经存在的数据进行修改操作。

好文要顶 关注我 收藏该文  

MongoDB save()方法和insert()方法的区别相关推荐

  1. 请简述一下线程的sleep()方法和yield()方法的区别?

    请简述一下线程的sleep()方法和yield()方法的区别? ①sleep()方法给其他线程机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会. yield()方法只会给相同优先级或更高优 ...

  2. Java并发编程—schedule方法和scheduleAtFixedRate方法的区别

    原文作者:一叶丿清风 原文地址:schedule方法和scheduleAtFixedRate方法的区别 schedule方法和scheduleAtFixedRate方法都可以实现任务的延时和不延时执行 ...

  3. flush方法和close方法的区别

    package com.learn.Demo05Writer;import java.io.FileWriter; import java.io.IOException;/*flush方法和close ...

  4. ExtJS中listener方法和handler方法的区别

    listener方法和handler方法的区别在文档中的说明的太玄乎了,看不懂 listeners监听能够对一个click Event事件添加任意多个的事件响应处理函数 而handler处理只能够通过 ...

  5. python predict_对Keras中predict()方法和predict_classes()方法的区别说明

    1 predict()方法 当使用predict()方法进行预测时,返回值是数值,表示样本属于每一个类别的概率,我们可以使用numpy.argmax()方法找到样本以最大概率所属的类别作为样本的预测标 ...

  6. java——Scanner中nextLine()方法和next()方法的区别

    遇到一个有意思的东西,在整理字符串这块知识的时候,发现我在用Scanner函数时,在字符串中加入空格,结果空格后面的东西没有输出来(/尴尬),不多说直接上代码: import java.util.Sc ...

  7. dispose方法和setvisible方法的区别和使用

    dispose方法和setvisible方法的区别: dispose()撤销当前窗口,并释放当前窗口所使用的资源. setVisible()方法仅仅隐藏窗体,可设置窗口是否可见,窗口默认是不可见的. ...

  8. get方法和post方法的区别及常用的请求方式

    get方法和post方法的区别: get方法是从服务器上获取资源:post方法是向服务器传送数据: get方法参数是通过url传递的,post方法是放在request body中:GET比POST更不 ...

  9. Keras中predict()方法和predict_classes()方法的区别

    正如上篇博客中所讲,在Keras框架下执行深度学习任务时,一般会先根据训练数据集训练出模型,然后拿训练好的模型到生产环境(测试集)中部署并生产.以分类问题为例,当训练好了分类模型之后,我们要用这个模型 ...

  10. VBA中Activate方法和Select方法的区别

    VBA中的Activate方法和Select方法看起来似乎相同,其实二者是有区别的.Activate方法的作用是激活,而Select方法的作用是选择.其区别如下: 1.对于"Sheets&q ...

最新文章

  1. 使用editcap命令将ERF格式转换为pcap格式
  2. 微量元素重塑新生态-农业大健康·李喜贵:谋定功能性农业
  3. 【BZOJ-2325】道馆之战 树链剖分 + 线段树
  4. (二):集成日志框架:springboot使用logback日志框架
  5. 基于C#在WinCE6.0系统SQLCE3.5的安装开发使用
  6. python建筑案例_Python数据分析实战-链家北京二手房价分析
  7. python 公开课_python公开课视频(11~20)
  8. 安装deepin_deepin使用笔记,安装steam客户端
  9. php mysql服务器配置_PHPMYSQL服务器配置说明_PHP
  10. linux 关闭redis 命令_面试必问的 Redis:RDB、AOF、混合持久化
  11. android打印动画,Android 中的转场动画及兼容处理
  12. win7域用户生成临时文件夹
  13. swift 有道 翻译文档(1 定义变量常量,数组字典)
  14. linux启动java命令
  15. opendrive中的Road
  16. 零中频接收机频率转换图_VHF跳频电台接收机射频前端的仿真设计
  17. 流程图与算法_流程图与算法之间的区别
  18. 一个佛教的故事,割肉
  19. oracle datamodeler,查看您的 Oracle SQL Developer Data Modeler 设计
  20. UI设计中异常状态设计总结

热门文章

  1. 32、至少列举8个常用模块都有那些?
  2. babel 配置整理
  3. pdf幻灯片:圆锥曲线中的“三定”问题探究(一)
  4. 虚拟机中centos7 安装过程中没有自动获取到网络
  5. java编解码技术,netty nio
  6. [嵌入式]I2C协议指东
  7. 生成swc库文件若干方法
  8. TFTPClient
  9. java模式之工厂模式
  10. 折线分割平面(递推dp)