MongoDB의 모든 문서에 대한 필드 이름을 바꾸려면 어떻게해야합니까?


223

MongoDB에 5000 개의 레코드가있는 컬렉션이 있다고 가정하면 각각 다음과 유사한 내용이 포함됩니다.

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

모든 문서에서 "추가"필드의 이름을 "마지막"으로 바꾸는 쉬운 방법이 있습니까? 나는 보았다 $ 이름 바꾸기 문서에서 연산자를하지만 서브 필드를 지정하는 방법에 대한 정말 명확하지 않다.

답변:


424

당신이 사용할 수있는:

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

1
그리고 나는군요 경우 upsert:true필드 이름이 존재하지 않는 경우에, 기본값을 필드 이름을 생성합니다 false.
IGRACH

1
어떤 이유로 든 "table.field" : "table.field"구문을 사용할 때 이것이 작동하지 않았습니다 . "field" : "field"구문을 사용했을 때 작동했습니다 .
Ben

@Steve name.last는 아닙니다 table.field. 질문을 읽으면 name필드에 객체가있는 것을 볼 수 있습니다 .
Marc Dingena 8

이것은 배열에서도 작동합니까? 할 수 있습니까 : db.foo.update({}, {$rename:{"name.0.additional":"name.0.last"}}, false, true)?
bncc

49

시도하십시오 db.collectionName.update({}, { $rename : { 'name.additional' : 'name.last' } }, { multi: true } )

이것을 읽으십시오 :) http://docs.mongodb.org/manual/reference/operator/rename/#_S_rename


1
링크를 업데이트하십시오. 새 문서에서 upsertmulti옵션 에 대해 아무 말도하지 않는 것 같습니다 .
Akos K

1
새 문서에 따르면 다음과 같이 표시되어야합니다. db.collectionName.updateMany ({}, {$ rename : { 'name.additional': 'name.last'}})
1r3k

15

몽고 이드로 똑같은 일을해야한다면 :

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

최신 정보

구문이 다음과 같이 변경되었습니다 monogoid 4.0.0.

Model.all.rename(old_field: :new_field)

11
마지막 monogoid (4.0.0)의 구문에 변화가 있습니다Model.all.rename(old_field: :new_field)
Calin

포함 된 문서에이 옵션을 사용하는 방법
Huzaifa Saifuddin

2

누구나이 명령을 사용하여 컬렉션에서 필드의 이름을 바꿀 수 있습니다 (_id를 사용하지 않음).

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

참조 참고


0

@Felix Yan이 이전 방식이 잘 작동하는 것처럼 언급 한 것처럼이 nodejs 코드는 그렇게합니다. 다른 코드 조각에 문제가있어 도움이되기를 바랍니다.

"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);

위의 방법에서 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/


임베딩 옵션이 작동하지 않습니다 ...이 오류가 발생합니다. "요소 (주소. 도시 주소)를 사용하여 요소를 통과 할 수 없습니다"
Huzaifa Saifuddin

0

MongoMapper를 사용하는 경우 다음과 같이 작동합니다.

Access.collection.update( {}, { '$rename' => { 'location' => 'location_info' } }, :multi => true )
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.