MongoDB $rename 给字段一次重新命名的机会

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

在日常编写程序过程中,命名错误是经常出现的错误。拼写错误的单词,大小写字母的错误等。还有另外一种场景,一些字段定义在文档的顶层,而随着项目的进展,开发人员期望将字段移动到文档的嵌套文档当中。

Mongodb的$rename方法,为开发人员提供了字段名称修改的便利。同时该方法也支持嵌套文档字段的移动。

定义

操作符$rename修改字段的名称

语法

{ $rename: {<field1>: <newName1>, <field2>: <newName2>, ...}}

其中,新的字段名称必须与已有字段不同。

在下面的更新语句中,将字段名称nickname更新为字段 alias, 同时将字段cell更新为mobile

db.students.updateOne(
    {_id: 1}, {$rename: {'nickname': 'alias', 'cell': 'mobile'}}
)

行为

当在UPDATE中使用$rename操作时,Mongodb完成了下面的行为

  • 使用$unset删除带有原来字段名称的字段和新字段名称的字段。
  • 执行$set操作,将字段值和新字段名称添加到文档中。

使用$rename时,对每个文档的操作是原子操作。$rename操作可能不会保留文档中字段排序。支持将字段从嵌套文档中搬入搬出。但不支持文档数组中字段的搬入和搬出。

当文档中存在与新字段名称相同的字段时,文档中已有同名字段会被删除。

重命名文档中不存在的字段时,使用$rename操作不会对文档进行更新。

mongodb 5.0版本以后,向$rename传入空表达式({ })时,mongodb不再抛出错误。空表达式不会修改字段值 ,也不会在oplog中,添加新的操作记录。

应用

构建测试集合students并插入数据。能够看到,插入集合中字段名称"nmae"输入错误。

db.students.insertMany([
    {
        "_id": 1, 
        "alias": ["The American Cincinnatus", "The American Fabius"],
        "mobile": "555-555-5555",
        "nmae": { "first": "george","last": "washington"}
    }, {
        "_id": 2, 
        "alias": ["My dearest friend"],
        "mobile": "222-222-2222",
        "nmae": { "first": "abigail","last": "adams"}
    }, {
        "_id": 3, 
        "alias": ["Amazing grace"],
        "mobile": "111-111-1111",
        "nmae": { "first": "grace","last": "hopper"}
    }
    ])

构建数据更新语句,修改字段名称。

db.students.updateMany(
    {"nmae": {$ne: null}},
    {$rename: {"nmae": "name"}}
    )  

构建另外一个UPDATE语句,修改嵌套文档中的名称。

db.students.updateOne(
    {_id: 1},
    { $rename: {"name.first": "name.fname"}}
    )   

修改一个不存在的字段名称。返回结果中修改文档数量为0

db.students.updateOne({_id: 1}, {$rename: {'wife': 'spouse'}})    
{
	"acknowledged" : true,
	"matchedCount" : 1,
	"modifiedCount" : 0
}

相关推荐

  1. MongoDB $rename 字段重新命名机会

    2024-06-07 11:56:02       10 阅读
  2. 利用strace探测cp命令拷多少字节

    2024-06-07 11:56:02       35 阅读
  3. Postgres实体表重构经历

    2024-06-07 11:56:02       16 阅读
  4. mybatis一对一,对多,字段重复

    2024-06-07 11:56:02       12 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-07 11:56:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-07 11:56:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-07 11:56:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-07 11:56:02       20 阅读

热门阅读

  1. docker-compose部署Redis6.0

    2024-06-07 11:56:02       7 阅读
  2. Spark read load Parquet Files

    2024-06-07 11:56:02       8 阅读
  3. 悉数六大设计原则

    2024-06-07 11:56:02       9 阅读
  4. 超长正整数的加法

    2024-06-07 11:56:02       11 阅读
  5. WPF Command 的使用

    2024-06-07 11:56:02       8 阅读
  6. 算法学习笔记——算法和数据结构简介

    2024-06-07 11:56:02       10 阅读
  7. 解释Servlet过滤器的作用和用法

    2024-06-07 11:56:02       8 阅读
  8. 【WPF编程宝典】第7讲:样式和触发器

    2024-06-07 11:56:02       9 阅读