2012-02-13 24 views
151

Giả sử tôi có một bộ sưu tập trong MongoDB với 5000 hồ sơ, mỗi một cái gì đó có chứa tương tự như:Làm cách nào để đổi tên trường cho tất cả tài liệu trong MongoDB?

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

Có một cách dễ dàng để đổi tên trường "bổ sung" để "cuối cùng" trong tất cả các tài liệu? Tôi đã thấy toán tử $rename 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.

Trả lời

286

Bạn có thể sử dụng:

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

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

Hoặc bạn có thể sử dụng cách cũ:

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 việc này là

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

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

+0

Cảm ơn bạn! Tôi đã chỉnh sửa câu trả lời của mình để sửa lỗi này. –

+43

Chỉ một từ 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, true' trong phương thức' update' của phiên bản '$ rename' là:' {upsert: false, multi: true } '. Bạn cần 'multi: true' để cập nhật tất cả các bản ghi của bạn. – RickyA

+1

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

44

hãy thử db.collectionName.update({}, { $rename : { 'name.additional' : 'name.last' } }, { multi: true })

và đọc :) 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 'upsert' và' multi'. –

+0

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

12

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

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

CẬP NHẬT

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

Model.all.rename(old_field: :new_field) 
+10

Có thay đổi trong cú pháp trong monogoid (4.0.0) 'Model.all.rename (old_field:: new_field)' – Calin

1

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

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

thấy FYI

0

này nodejs mã chỉ làm điều đó, như @ Felix Yan đề cập đến cách cũ dường như làm việc tốt, tôi đã có một số vấn đề với các snipets khác hy vọng điều này sẽ giúp.

này sẽ đổi tên cột "oldColumnName" là "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:[email protected]: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

Nhà điều hành $ đổ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>, ... } } 

cho e.g

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 tài liệu được nhúng, hãy sử dụng ký hiệu chấm.

Thao tác này đổi tên các nmae lĩnh vực để đặt 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 các phương pháp trên sai sự thật, sự thật là: {upsert: false, đa: true} .Để cập nhật tất cả hồ sơ của bạn , Bạn cần đa: đúng.

Đổi tên một lĩnh vực trong một tài liệu Embedded

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/

Các vấn đề liên quan