programing

MongoDB에 있는 모든 문서의 필드 이름을 변경하려면 어떻게 해야 합니까?

fastcode 2023. 3. 16. 21:55
반응형

MongoDB에 있는 모든 문서의 필드 이름을 변경하려면 어떻게 해야 합니까?

5000개의 레코드가 있는 MongoDB 컬렉션이 있다고 가정합니다.각 레코드에는 다음과 같은 것이 포함되어 있습니다.

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

모든 문서에서 필드의 이름을 "추가"에서 "마지막"으로 쉽게 바꿀 수 있는 방법이 있습니까?설명서에서 $rename 연산자를 봤는데 서브필드를 지정하는 방법을 잘 모르겠습니다.

다음을 사용할 수 있습니다.

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/

$rename 필드 업데이트 연산자를 사용할 수 있습니다.

db.collection.update(
  {},
  { $rename: { 'name.additional': 'name.last' } },
  { multi: true }
)

만약 당신이 mongoid에 대해 같은 일을 해야 한다면:

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

갱신하다

의 구문이 변경되었습니다.monogoid 4.0.0:

Model.all.rename(old_field: :new_field)

누구나 잠재적으로 이 명령을 사용하여 컬렉션에서 필드 이름을 변경할 수 있습니다(_id를 사용하지 않음).

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

참고:

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/ 링크를 사용합니다.

@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!");
}

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

Access.collection.update( {}, { '$rename' => { 'location' => 'location_info' } }, :multi => true )

언급URL : https://stackoverflow.com/questions/9254351/how-can-i-rename-a-field-for-all-documents-in-mongodb

반응형