ฉันจะเปลี่ยนชื่อฟิลด์สำหรับเอกสารทั้งหมดใน MongoDB ได้อย่างไร


223

สมมติว่าฉันมีคอลเลกชันใน MongoDB ที่มี 5,000 เร็กคอร์ดแต่ละรายการมีสิ่งที่คล้ายกับ:

{
"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, trueในupdateวิธีการของ$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

มันทำงานร่วมกับอาร์เรย์ได้หรือไม่ ฉันสามารถทำได้: 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
โปรดอัปเดตลิงก์ดูเหมือนว่าเอกสารใหม่จะไม่พูดอะไรเกี่ยวกับตัวเลือกupsertและ multi
Akos K

1
ตามเอกสารใหม่ควรมีลักษณะ: db.collectionName.updateMany ({}, {$ เปลี่ยนชื่อ: {'name.additional': 'name.last'}})
1r3k

15

หากคุณต้องการทำสิ่งเดียวกันกับ mongoid:

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

UPDATE

มีการเปลี่ยนแปลงในไวยากรณ์ในmonogoid 4.0.0:

Model.all.rename(old_field: :new_field)

11
มีการเปลี่ยนแปลงในไวยากรณ์ใน monogoid สุดท้าย (4.0.0) เป็นModel.all.rename(old_field: :new_field)
Calin

ฉันจะใช้ตัวเลือกนี้สำหรับเอกสาร
ฝังได้อย่างไร

2

ทุกคนสามารถใช้คำสั่งนี้เพื่อเปลี่ยนชื่อฟิลด์จากคอลเล็กชัน (โดยไม่ใช้ _id ใด ๆ ):

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

เห็นFYI


0

รหัส 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!");
}

0

ฉันใช้Mongo 3.4.0

ตัวดำเนินการ $ rename จะอัพเดตชื่อของฟิลด์และมีแบบฟอร์มต่อไปนี้:

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

สำหรับเช่น

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

ชื่อฟิลด์ใหม่จะต้องแตกต่างจากชื่อฟิลด์ที่มีอยู่ ในการระบุ a ในเอกสารแบบฝังให้ใช้เครื่องหมายจุด

การดำเนินการนี้จะเปลี่ยนชื่อฟิลด์ 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} หากต้องการอัปเดตระเบียนทั้งหมดของคุณคุณต้องมีหลายรายการ: true

เปลี่ยนชื่อฟิลด์ในเอกสารที่ฝัง

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

ใช้ลิงค์: https://docs.mongodb.com/manual/reference/operator/update/rename/


ตัวเลือกการฝังไม่ทำงาน ... ฉันได้รับข้อผิดพลาดนี้ "ไม่สามารถใช้ส่วน (ที่อยู่ของ address.city) เพื่อสำรวจองค์ประกอบ"
Huzaifa Saifuddin

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.