Làm cách nào tôi có thể đổi tên một trường cho tất cả các tài liệu trong MongoDB?


223

Giả sử tôi có một bộ sưu tập trong MongoDB với 5000 bản ghi, mỗi bản ghi có chứa một cái gì đó tương tự:

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

Có cách nào dễ dàng để đổi tên trường "bổ sung" thành "cuối cùng" trong tất cả các tài liệu không? Tôi đã thấy toán tử $ đổi tên trong tài liệu nhưng tôi không thực sự rõ ràng về cách chỉ định trường con.

Câu trả lời:


423

Bạn có thể dùng:

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

Hoặc chỉ cập nhật các tài liệu có chứa tài sản:

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

Các false, truephương pháp trên là : { upsert:false, multi:true }. Bạn cần multi:truecập nhật tất cả các hồ sơ của bạn.

Hoặc bạn có thể sử dụng cách trước đây:

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

Trong MongoDB 3.2, bạn cũng có thể sử dụng

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

Cú pháp chung của điều này là

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

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


52
Chỉ là một từ cho nếu bạn đang đập đầu vào tường vì không có gì được cập nhật hàng loạt: false, truetrong updatephương pháp của $renamephiên bản là : { upsert:false, multi:true }. Bạn cần multi:truecập nhật tất cả các hồ sơ của bạn.
RickyA

1
và nếu tôi nhận được nó upsert:truesẽ tạo tên trường nếu tên trường không tồn tại, mặc định là false.
IGRACH

1
Vì một số lý do, điều này không hiệu quả với tôi khi tôi sử dụng "table.field" : "table.field"cú pháp. Nó đã làm việc khi tôi chỉ sử dụng "field" : "field"cú pháp.
Ben

@Steve name.lastthì không table.field. Nếu bạn đọc câu hỏi, bạn có thể thấy rằng nametrường giữ một đối tượng.
Marc Đinhena

Đây có phải là làm việc với các mảng là tốt? Tôi có thể làm được db.foo.update({}, {$rename:{"name.0.additional":"name.0.last"}}, false, true)không?
bncc

49

Vui lòng thử db.collectionName.update({}, { $rename : { 'name.additional' : 'name.last' } }, { multi: true } )

và đọc nó :) http://docs.mongodb.org/manual/reference/operator/rename/#_S_rename


1
Vui lòng cập nhật liên kết, có vẻ như tài liệu mới không nói gì về các tùy chọn upsertmulti.
Akos K

1
Theo tài liệu mới, nó sẽ trông giống như: db.collectionName.updateMany ({}, {$ rename: {'name.additable': 'name.last'}})
1r3k

15

Nếu bạn cần làm điều tương tự với mongoid:

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

CẬP NHẬT

Có sự thay đổi trong cú pháp trong monogoid 4.0.0:

Model.all.rename(old_field: :new_field)

11
Có sự thay đổi trong cú pháp trong đơn âm cuối cùng (4.0.0)Model.all.rename(old_field: :new_field)
Calin

Làm cách nào tôi có thể sử dụng tùy chọn này cho tài liệu nhúng
Huzaifa Saifuddin

2

Bất cứ ai cũng có khả năng sử dụng lệnh này để đổi tên một trường từ bộ sưu tập (Bằng cách không sử dụng bất kỳ _id nào):

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

xem FYI


0

Mã nodejs này chỉ làm được điều đó, vì @Felix Yan đã đề cập đến cách trước đây có vẻ hoạt động tốt, tôi có một số vấn đề với các snipet khác hy vọng điều này sẽ giúp ích.

Điều này sẽ đổi tên cột "oldColumnName" thành "newColumnName" của bảng "tài liệu"

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

Tôi đang sử dụng, Mongo 3.4.0

Toán tử $ đổi tên cập nhật tên của một trường và có dạng sau:

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

ví dụ

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

Tên trường mới phải khác với tên trường hiện có. Để chỉ định một trong tài liệu nhúng, sử dụng ký hiệu dấu chấm.

Thao tác này đổi tên trường nmae thành tên cho tất cả các tài liệu trong bộ sưu tập:

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

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

Trong phương thức trên false, true là: {upsert: false, multi: true}. Để cập nhật tất cả các bản ghi của bạn, Bạn cần multi: true.

Đổi tên một trường trong một tài liệu nhúng

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

sử dụng liên kết: https://docs.mongodb.com/manual/reference/operator/update/rename/


Tùy chọn nhúng không hoạt động ... Tôi gặp lỗi này "không thể sử dụng phần (địa chỉ của address.city) để duyệt qua phần tử"
Huzaifa Saifuddin

0

Nếu bạn đang sử dụng MongoMapper, điều này hoạt động:

Access.collection.update( {}, { '$rename' => { 'location' => 'location_info' } }, :multi => true )
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.