MongoDBのすべてのドキュメントのフィールド名を変更するにはどうすればよいですか?


223

MongoDBに5000レコードのコレクションがあり、それぞれに次のようなものが含まれていると仮定します。

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

すべてのドキュメントでフィールドの名前を「追加」から「最後」に変更する簡単な方法はありますか?私が見た$リネームドキュメントで作業を私はサブフィールドを指定する方法の本当に明確ではありませんよ。

回答:


423

以下を使用できます。

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

または、プロパティを含むドキュメントを更新するには:

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

false, true上記の方法では、次のとおりです{ upsert:false, multi:true }すべてのレコードmulti:trueを更新する必要があります。

または、前者の方法を使用できます。

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/


52
何も大量に更新されていないために壁に頭をぶつけている場合のための言葉です:バージョンfalse, trueupdateメソッドの$renameは:{ upsert:false, multi:true }です。multi:trueすべてのレコードを更新する必要があります。
RickyA 2013年

1
そして私はそれが取得していた場合upsert:true、フィールド名が存在しない場合に、デフォルト値をフィールド名を作成しますfalse
IGRACH、2015年

1
何らかの理由で、"table.field" : "table.field"構文を使用した場合、これは私にとってはうまくいきませんでした。"field" : "field"構文を使用しただけではうまくいきました。
Ben

@Steve name.lastは違いtable.fieldます。質問を読むと、nameフィールドにオブジェクトが保持されていることがわかります。
Marc Dingena、2015年

これは配列でも機能しますか?できますdb.foo.update({}, {$rename:{"name.0.additional":"name.0.last"}}, false, true)か?
bncc 2016年

49

してみてください db.collectionName.update({}, { $rename : { 'name.additional' : 'name.last' } }, { multi: true } )

そしてこれを読んでください:) http://docs.mongodb.org/manual/reference/operator/rename/#_S_rename


1
リンクを更新してください。新しいドキュメントにはupsertおよびmultiオプションについて何も記載されていないようです。
Akos K

1
新しいドキュメントによると、次のようになります。db.collectionName.updateMany({}、{$ rename:{'name.additional': 'name.last'}})
1r3k

15

mongoidで同じことをする必要がある場合:

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

更新

の構文に変更がありますmonogoid 4.0.0

Model.all.rename(old_field: :new_field)

11
最後のモノゴイド(4.0.0)の構文に変更がありますModel.all.rename(old_field: :new_field)
Calin

埋め込みドキュメントにこのオプションを使用するにはどうすればよいですか
Huzaifa Saifuddin

2

誰でもこのコマンドを使用して、コレクションのフィールドの名前を変更できます(_idを使用しないことで)。

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

参照FYI


0

このnodejsコードはそれを行うだけです。@ Felix Yanが以前の方法はうまく機能するように見えるので、他のスニペットにいくつかの問題があり、これが役立つことを願っています。

これにより、列「oldColumnName」の名前がテーブル「documents」の「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!");
}

0

Mongo 3.4.0を使用しています

$ rename演算子はフィールドの名前を更新し、次の形式になります。

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

例えば

db.getCollection('user').update( { _id: 1 }, { $rename: { 'fname': 'FirstName', 'lname': 'LastName' } } )

新しいフィールド名は、既存のフィールド名とは異なる必要があります。埋め込みドキュメントでを指定するには、ドット表記を使用します。

この操作により、フィールドnmaeの名前がコレクション内のすべてのドキュメントの名前に変更されます。

db.getCollection('user').updateMany( {}, { $rename: { "add": "Address" } } )

db.getCollection('user').update({}, {$rename:{"name.first":"name.FirstName"}}, false, true);

上記のメソッドのfalse、trueは次のとおりです。{upsert:false、multi:true}。すべてのレコードを更新するには、multi:trueが必要です。

埋め込みドキュメントのフィールドの名前を変更する

db.getCollection('user').update( { _id: 1 }, { $rename: { "name.first": "name.fname" } } )

リンクを使用:https : //docs.mongodb.com/manual/reference/operator/update/rename/


埋め込みオプションが機能しない...このエラーが発生する「要素
address.city

0

MongoMapperを使用している場合、これは機能します。

Access.collection.update( {}, { '$rename' => { 'location' => 'location_info' } }, :multi => true )
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.