我如何重命名MongoDB中所有文档的字段?

假设我在MongoDB中有一个包含5000个logging的集合,每个logging包含类似于:

{ "occupation":"Doctor", "name": { "first":"Jimmy", "additional":"Smith" } 

是否有一种简单的方法来重命名所有文档中的“附加”字段? 我在文档中看到了$ rename操作符,但是我不太清楚如何指定一个子字段。

您可以使用:

 db.foo.update({}, {$rename:{"name.additional":"name.last"}}, false, true); 

上面的方法中的false, true是: { upsert:false, multi:true } 。 您需要multi:true来更新所有logging。

或者你可以用以前的方式:

 remap = function (x) { if (x.additional){ db.foo.update({_id:x._id}, {$set:{"name.last":x.name.additional}, $unset:{"name.additional":1}}); } } db.foo.find().forEach(remap); 

在MongoDB 3.2中,你也可以使用

 db.students.updateMany( {}, { $rename: { "oldname": "newname" } } ) 

这是一般的语法

 db.collection.updateMany(filter, update, options) 

https://docs.mongodb.com/manual/reference/method/db.collection.updateMany/

请尝试db.collectionName.update({}, { $rename : { 'name.additional' : 'name.last' } }, { multi: true } )

并阅读此:) http://docs.mongodb.org/manual/reference/operator/rename/#_S_rename

如果你需要用mongoid做同样的事情:

 Model.all.rename(:old_field, :new_field) 

UPDATE

monogoid 4.0.0中的语法有所改变:

 Model.all.rename(old_field: :new_field) 

任何人都可能使用这个命令来重命名集合中的一个字段(通过不使用任何_id):

 dbName.collectionName.update({}, {$rename:{"oldFieldName":"newFieldName"}}, false, true); 

见FYI

这个nodejs代码就是这么做的,就像@Felix Yan提到的前一种方式似乎工作得很好,我有一些其他snipets的问题,希望这有助于。

这将重命名列“oldColumnName”为表“文档”的“newColumnName”

 var MongoClient = require('mongodb').MongoClient , assert = require('assert'); // Connection URL //var url = 'mongodb://localhost:27017/myproject'; var url = 'mongodb://myuser:mypwd@myserver.cloud.com:portNumber/databasename'; // Use connect method to connect to the server MongoClient.connect(url, function(err, db) { assert.equal(null, err); console.log("Connected successfully to server"); renameDBColumn(db, function() { db.close(); }); }); // // This function should be used for renaming a field for all documents // var renameDBColumn = function(db, callback) { // Get the documents collection console.log("renaming database column of table documents"); //use the former way: remap = function (x) { if (x.oldColumnName){ db.collection('documents').update({_id:x._id}, {$set:{"newColumnName":x.oldColumnName}, $unset:{"oldColumnName":1}}); } } db.collection('documents').find().forEach(remap); console.log("db table documents remap successfully!"); }