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.

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/


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


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)

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


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

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/


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 )
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.