• MongoDB UPDATE使用$setOnInsert为新插入数据设置默认值


    学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第60篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。

    使用Mongodb UPDATE数据更新字段,当文档不存在,通过指定{upsert: true},可以向数据库插入这条不存在的数据。插入新的数据时,在某些业务场景中,期望对指定字段插入默认值 。比如小学生入学时,默认插入年级为1年级。而不需要更新已存在的数据值。

    Mongodb 提供了$setOnInsert方法,当更新不存在的数据,触发insert操作时,向字段指定值。而当数据存在时,只执行$set方法中的字段更新。

    定义

    在UPDATE语句中,指定{upsert: true}. 当触发新的文档插入操作时,使用$setOnInsert方法向插入文档的指定字段指定默认值。当没有新的文档插入时,不会执行$setOnInsert方法里的语句。

    语法

    1. db.collection.updateOne(
    2. <query>,
    3. { $setOnInsert: { <field1>: <value1>,...}},
    4. { upsert: true}
    5. )

    指定嵌套文档或数组文档中的字段时,使用点操作符。

    行为

    • 自mongodb5.0开始,UPDATE操作按照字段名称的字典顺序更新字段。当字段中包含数字时,按照数字顺序依次更新字段。当然,对一个文档的多个字段操作,是原子性的。
    • mongodb 5.0版本以后,向$setOnInsert传入空表达式({ })时,mongodb不再抛出错误。空表达式不会修改字段值 ,也不会在oplog中,添加新的操作记录。

    应用

    创建products集合并向集合中插入数据。

    1. db.products.insertOne({
    2. _id: 100,
    3. quantity: 250,
    4. instock: true,
    5. reorder: false,
    6. details: { model: "14QQ", make: "Clothes Corp" },
    7. tags: [ "apparel", "clothing" ],
    8. ratings: [ { by: "Customer007", rating: 4 } ]
    9. })

    编写数据更新语句,更新products集合中不存在的数据,指定{upsert: true}。使用$setOnInsert方法,当更新的数据不存在时,插入默认字段{ defaultQty: 100}.

    1. db.products.updateOne(
    2. {_id: 1},
    3. {
    4. $set: {item: "apple"},
    5. $setOnInsert: {defaultQty: 100}
    6. },
    7. {
    8. upsert: true
    9. }
    10. )

    编写数据更新语句,更新文档{_id:100}。指定{upsert: true},使用$setOnInsert方法,当更新的数据不存在时,插入默认字段{ defaultQty: 100}.

    1. db.products.updateOne(
    2. {_id: 100},
    3. {
    4. $set: {item: "apple"},
    5. $setOnInsert: {defaultQty: 100}
    6. },
    7. {
    8. upsert: true
    9. }
    10. )

    查看数据更新结果,$setOnInsert方法并未执行。

  • 相关阅读:
    RK3399平台开发系列讲解(PCI/PCI-E)5.54、PCIE INTx中断机制
    点亮现代编程语言的男人——C语言/UNIX之父Dennis Ritchie
    LeetCode每日一题(2285. Maximum Total Importance of Roads)
    Editors(Vim)
    MySQL表的约束
    基于 SM3 的密钥派生函数 (KDF):国密合规的安全密钥生成方案
    物流职业怎么运用自动化员工保证清算效率
    【DDR3 控制器设计】(7)DDR3 的用户端口读写模块设计
    树莓派按键控制LED(中断方式)
    vite+vue3+ts开发web日语项目,支持主题切换,pinia状态持久化管理
  • 原文地址:https://blog.csdn.net/wilsonzane/article/details/139458257