MongoDB'deki tüm belgeler için bir alanı nasıl yeniden adlandırabilirim?


223

Her biri aşağıdakine benzer bir şey içeren 5000 kayıt içeren bir koleksiyonum olduğunu varsayarsak:

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

Tüm belgelerde "ek" alanını "son" olarak yeniden adlandırmanın kolay bir yolu var mı? $ Rename operatörü belgelerde gördüm ama bir alt alan belirtme konusunda gerçekten net değilim.

Yanıtlar:


424

Kullanabilirsiniz:

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

Veya yalnızca özelliği içeren dokümanları güncellemek için:

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

false, trueYukarıdaki yöntem bulunmaktadır: { upsert:false, multi:true }. İhtiyacınız multi:truegüncellemek için tüm kayıtlarınızı .

Veya eski yolu kullanabilirsiniz:

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'de şunları da kullanabilirsiniz:

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

Bunun genel sözdizimi

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

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


52
: Hiçbir şey kütlesi güncellenir çünkü duvara karşı baş vurarak eğer için sadece bir kelime false, trueiçinde updateyöntemine $renamesürümü vardır: { upsert:false, multi:true }. multi:trueTüm kayıtlarınızı güncellemeniz gerekir .
RickyA

1
ve eğer upsert:truealan adı yoksa alan adı oluşturursa, varsayılan olarak false.
IGRACH

1
Herhangi bir nedenle, "table.field" : "table.field"sözdizimini kullandığımda bu benim için işe yaramadı . Sadece "field" : "field"sözdizimini kullandığımda işe yaradı .
Ben

@Steve name.lastdeğil table.field. Soruyu okursanız, namealanın bir nesne içerdiğini görebilirsiniz .
Marc Dingena

Bu da dizilerle mi çalışıyor? Yapabileceğim: db.foo.update({}, {$rename:{"name.0.additional":"name.0.last"}}, false, true)?
bncc

49

deneyin lütfen db.collectionName.update({}, { $rename : { 'name.additional' : 'name.last' } }, { multi: true } )

ve bunu okuyun :) http://docs.mongodb.org/manual/reference/operator/rename/#_S_rename


1
Lütfen bağlantıyı güncelleyin, yeni dokümantasyon upsertve multiseçenekleri hakkında hiçbir şey söylemiyor gibi görünüyor .
Akos K

1
Yeni belgelere göre, şu şekilde görünmelidir: db.collectionName.updateMany ({}, {$ rename: {'name.additional': 'name.last'}})
1r3k

15

Mongoid ile aynı şeyi yapmanız gerekiyorsa:

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

GÜNCELLEME

Sözdiziminde değişiklik var monogoid 4.0.0:

Model.all.rename(old_field: :new_field)

11
Son monogoidde (4.0.0) sözdiziminde değişiklik varModel.all.rename(old_field: :new_field)
Calin

Bu seçeneği gömülü belge için nasıl kullanabilirim
Huzaifa Saifuddin

2

Herkes bu komutu koleksiyondaki bir alanı yeniden adlandırmak için kullanabilir (Herhangi bir _id kullanarak):

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

bkz. FYI


0

@Felix Yan eski yolun gayet iyi göründüğünden bahsettiği gibi, bu nodejs kodu sadece bunu yapar, diğer snipets ile bazı sorunlar vardı bu yardımcı olur umarım.

Bu, "oldColumnName" sütununu, "belgeler" tablosunun "newColumnName" olarak yeniden adlandırır.

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

Kullanıyorum , Mongo 3.4.0

$ Rename operatörü bir alanın adını günceller ve aşağıdaki forma sahiptir:

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

örneğin

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

Yeni alan adı, mevcut alan adından farklı olmalıdır. Katıştırılmış bir belgede a belirtmek için nokta gösterimini kullanın.

Bu işlem, koleksiyondaki tüm belgeler için nmae alanını yeniden adlandırır:

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

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

Yukarıdaki yöntemde false, true: {upsert: false, multi: true} .Tüm kayıtlarınızı güncellemek için multi: true dosyasına ihtiyacınız vardır.

Gömülü Belgedeki Alanı Yeniden Adlandırma

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

bağlantıyı kullanın: https://docs.mongodb.com/manual/reference/operator/update/rename/


Gömme seçeneği çalışmıyor ... Bu hatayı alıyorum "öğeyi hareket
ettirmek

0

MongoMapper kullanıyorsanız, bu işe yarar:

Access.collection.update( {}, { '$rename' => { 'location' => 'location_info' } }, :multi => true )
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.