$rename
定义
$rename
的
$rename
运算符用于更新字段的名称。
语法
{ $rename: { <field1>: <newName1>, <field2>: <newName2>, ... } }
新字段名称必须与现有字段名称不同。要指定嵌入文档中的<字段>
,请使用点表示法.
考虑以下示例
db.students.updateOne( { _id: 1 }, { $rename: { 'nickname': 'alias', 'cell': 'mobile' } } )
上述操作将文档中_id
为1的文档中的nickname
字段重命名为alias
,并将cell
字段重命名为mobile
。
行为
当你运行一个 $rename
操作时,MongoDB 会执行以下操作
原子性
每个与更新命令匹配的文档都会在单独的操作中更新。更新操作(如 $rename
)只在单文档级别上保证原子性。
字段顺序
$rename
操作可能无法保留文档中字段的顺序。
更新处理顺序
从MongoDB 5.0版本开始,更新运算符按字典顺序处理以字符串命名的字段。数字命名的字段按数字顺序处理。有关详细信息,请参阅更新运算符行为。
重命名嵌套文档字段
$rename
运算符可以将字段移动到嵌套文档中或从中移出。
$rename
运算符不适用于数组中的嵌套文档。
其他注意事项
示例
创建students
集合
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" } } ] )
文档包含一个错误,nmae
应该为name
。以下各节中的示例更新了集合中的文档。
重命名字段
要重命名字段,使用$rename
操作符并指定当前字段名和新字段名
db.students.updateMany( { "nmae": { $ne: null } }, { $rename: { "nmae": "name" } } )
此操作检查nmae
字段不为空的文档,并将这些文档的nmae
字段重命名为name
{ "_id": 1, "alias": [ "The American Cincinnatus", "The American Fabius" ], "mobile": "555-555-5555", "name": { "first" : "george", "last" : "washington" } } { "_id" : 2, "alias" : [ "My dearest friend" ], "mobile" : "222-222-2222", "name" : { "first" : "abigail", "last" : "adams" } } { "_id" : 3, "alias" : [ "Amazing grace" ], "mobile" : "111-111-1111", "name" : { "first" : "grace", "last" : "hopper" } }
在嵌入式文档中重命名字段
要重命名嵌入式文档中的字段,使用点表示法调用 $rename
操作符来引用该字段。如果字段要保留在同一嵌入式文档中,则在新的名称中也使用点表示法,如下所示
db.students.updateOne( { _id: 1 }, { $rename: { "name.first": "name.fname" } } )
此操作将嵌入式字段 first
重命名为 fname
{ _id: 1, alias: [ 'The American Cincinnatus', 'The American Fabius' ], mobile: '555-555-5555', name: { last: 'washington', fname: 'george' } }
重命名不存在的字段
当重命名字段且现有字段名引用一个不存在的字段时,$rename
操作符不执行任何操作,如下所示
db.students.updateOne( { _id: 1 }, { $rename: { 'wife': 'spouse' } } )
此操作不执行任何操作,因为没有名为 wife
的字段。