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.

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/


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


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)

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


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: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

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/


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 )
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.