Bagaimana saya bisa mengganti nama bidang untuk semua dokumen di MongoDB?

223

Dengan asumsi saya memiliki koleksi di MongoDB dengan 5000 catatan, masing-masing berisi sesuatu yang mirip dengan:

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

Apakah ada cara mudah untuk mengganti nama bidang "tambahan" menjadi "terakhir" di semua dokumen? Saya melihat operator $ rename dalam dokumentasi tapi saya tidak begitu jelas tentang cara menentukan subbidang.

soulkphp
sumber

Jawaban:

423

Kamu bisa memakai:

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

Atau untuk sekadar memperbarui dokumen yang berisi properti:

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

The false, truedalam metode di atas adalah: { upsert:false, multi:true }. Anda perlu multi:truememperbarui semua catatan Anda.

Atau Anda dapat menggunakan cara sebelumnya:

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

Di MongoDB 3.2 Anda juga bisa menggunakan

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

Sintaks umum dari ini adalah

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

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

Felix Yan
sumber
52
Hanya kata untuk jika Anda membenturkan kepala Anda ke dinding karena tidak ada yang massa diperbarui: yang false, truedi updatemetode dari $renameversi adalah: { upsert:false, multi:true }. Anda perlu multi:truememperbarui semua catatan Anda.
RickyA
1
dan jika saya mendapatkannya upsert:trueakan membuat nama bidang jika nama bidang tidak ada, standarnya adalah false.
IGRACH
1
Untuk beberapa alasan, ini tidak berhasil untuk saya ketika saya menggunakan "table.field" : "table.field"sintaks. Itu berhasil ketika saya baru saja menggunakan "field" : "field"sintaks.
Ben
@Steve name.lasttidak table.field. Jika Anda membaca pertanyaan, Anda bisa melihat bahwa namebidang menyimpan objek.
Marc Dingena
Apakah ini bekerja dengan array juga? Bisakah saya melakukan db.foo.update({}, {$rename:{"name.0.additional":"name.0.last"}}, false, true):?
bncc
49

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

dan baca ini :) http://docs.mongodb.org/manual/reference/operator/rename/#_S_rename

Alex
sumber
1
Harap perbarui tautan, sepertinya dokumentasi baru tidak mengatakan apa pun tentang opsi upsertdan multi.
Akos K
1
Menurut dokumentasi baru, seharusnya akan terlihat seperti: db.collectionName.updateMany ({}, {$ rename: {'name.additional': 'name.last'}})
1r3k
15

Jika pernah Anda perlu melakukan hal yang sama dengan mongoid:

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

MEMPERBARUI

Ada perubahan sintaksis di monogoid 4.0.0:

Model.all.rename(old_field: :new_field)
metakungfu
sumber
11
Ada perubahan dalam sintaksis dalam monogoid terakhir (4.0.0)Model.all.rename(old_field: :new_field)
Calin
Bagaimana saya bisa menggunakan opsi ini untuk dokumen
sematan
2

Siapa pun yang berpotensi menggunakan perintah ini untuk mengubah nama bidang dari koleksi (Dengan tidak menggunakan _id):

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

lihat FYI

Mants
sumber
0

Kode nodejs ini hanya melakukan itu, karena @Felix Yan menyebutkan cara sebelumnya tampaknya berfungsi dengan baik, saya punya beberapa masalah dengan snipets lain berharap ini bisa membantu.

Ini akan mengubah nama kolom "oldColumnName" menjadi "newColumnName" dari tabel "dokumen"

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!");
}
d1jhoni1b
sumber
0

Saya menggunakan, Mongo 3.4.0

Operator $ rename memperbarui nama bidang dan memiliki formulir berikut:

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

untuk mis

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

Nama bidang baru harus berbeda dari nama bidang yang ada. Untuk menentukan dalam dokumen yang disematkan, gunakan notasi titik.

Operasi ini mengganti nama field nmae menjadi nama untuk semua dokumen dalam koleksi:

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

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

Dalam metode di atas false, true adalah: {upsert: false, multi: true}. Untuk memperbarui semua catatan Anda, Anda memerlukan multi: true.

Ganti nama Bidang dalam Dokumen Tertanam

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

gunakan tautan: https://docs.mongodb.com/manual/reference/operator/update/rename/

Swadeshi
sumber
Opsi penyematan tidak berfungsi ... Saya mendapatkan kesalahan ini "tidak dapat menggunakan bagian (address of address.city) untuk melintasi elemen"
Huzaifa Saifuddin
0

Jika Anda menggunakan MongoMapper, ini berfungsi:

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