Wie kann ich ein Feld für alle Dokumente in MongoDB umbenennen?

223

Angenommen, ich habe eine Sammlung in MongoDB mit 5000 Datensätzen, die jeweils etwas Ähnliches enthalten wie:

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

Gibt es eine einfache Möglichkeit, das Feld "zusätzlich" in "zuletzt" in allen Dokumenten umzubenennen? Ich habe den Operator $ rename in der Dokumentation gesehen, bin mir aber nicht sicher, wie ein Unterfeld angegeben werden soll.

soulkphp
quelle

Antworten:

423

Sie können verwenden:

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

Oder um einfach die Dokumente zu aktualisieren, die die Eigenschaft enthalten:

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

Die false, truein der obigen Methode sind : { upsert:false, multi:true }. Sie benötigen das multi:true, um alle Ihre Datensätze zu aktualisieren .

Oder Sie können den früheren Weg verwenden:

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

In MongoDB 3.2 können Sie auch verwenden

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

Die allgemeine Syntax hierfür lautet

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

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

Felix Yan
quelle
52
Nur ein Wort für, wenn Sie Ihren Kopf gegen die Wand schlagen, weil nichts massenaktualisiert ist: Die false, truein der updateMethode der $renameVersion sind : { upsert:false, multi:true }. Sie benötigen das multi:true, um alle Ihre Datensätze zu aktualisieren.
RickyA
1
und wenn ich es bekomme, upsert:truewird ein Feldname erstellt, wenn der Feldname nicht existiert, standardmäßig false.
IGRACH
1
Aus irgendeinem Grund funktionierte dies bei mir nicht, als ich die "table.field" : "table.field"Syntax verwendete. Es hat funktioniert, als ich nur die "field" : "field"Syntax verwendet habe.
Ben
@Steve name.lastist nicht table.field. Wenn Sie die Frage lesen, können Sie sehen, dass das nameFeld ein Objekt enthält.
Marc Dingena
Funktioniert das auch mit Arrays? Kann ich machen : db.foo.update({}, {$rename:{"name.0.additional":"name.0.last"}}, false, true)?
Bncc
49

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

und lesen Sie dies :) http://docs.mongodb.org/manual/reference/operator/rename/#_S_rename

Alex
quelle
1
Bitte aktualisieren Sie den Link, anscheinend sagt die neue Dokumentation nichts über die upsertund multiOptionen aus.
Akos K
1
Laut der neuen Dokumentation sollte es so aussehen: db.collectionName.updateMany ({}, {$ rename: {'name.additional': 'name.last'}})
1r3k
15

Wenn Sie jemals dasselbe mit Mongoid tun müssen:

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

AKTUALISIEREN

Die Syntax ändert sich in monogoid 4.0.0:

Model.all.rename(old_field: :new_field)
Metakung Fu
quelle
11
Es gibt eine Änderung in der Syntax im letzten Monogoid (4.0.0)Model.all.rename(old_field: :new_field)
Calin
Wie kann ich diese Option für
eingebettete
2

Jeder kann diesen Befehl möglicherweise verwenden, um ein Feld aus der Sammlung umzubenennen (indem keine _id verwendet wird):

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

siehe FYI

Mants
quelle
0

Dieser NodeJS-Code macht einfach das, da @Felix Yan erwähnte, dass der frühere Weg gut zu funktionieren scheint. Ich hatte einige Probleme mit anderen Snipets und hoffe, dass dies hilft.

Dadurch wird die Spalte "oldColumnName" in "newColumnName" der Tabelle "documents" umbenannt.

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
quelle
0

Ich benutze Mongo 3.4.0

Der Operator $ rename aktualisiert den Namen eines Felds und hat die folgende Form:

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

für zB

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

Der neue Feldname muss vom vorhandenen Feldnamen abweichen. Verwenden Sie die Punktnotation, um ein in einem eingebetteten Dokument anzugeben.

Diese Operation benennt das Feld nmae in name für alle Dokumente in der Sammlung um:

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

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

In der obigen Methode sind false, true: {upsert: false, multi: true}. Um alle Ihre Datensätze zu aktualisieren, benötigen Sie multi: true.

Benennen Sie ein Feld in einem eingebetteten Dokument um

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

Verwenden Sie den Link: https://docs.mongodb.com/manual/reference/operator/update/rename/

Swadeshi
quelle
Die Einbettungsoption funktioniert nicht ... Ich erhalte die Fehlermeldung "Ich kann den Teil (Adresse von address.city) nicht zum Durchlaufen des Elements verwenden"
Huzaifa Saifuddin,
0

Wenn Sie MongoMapper verwenden, funktioniert dies:

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