Comment puis-je renommer un champ pour tous les documents dans MongoDB?

En supposant que J'ai une collection dans MongoDB avec 5000 enregistrements, chacun contenant quelque chose de similaire à:

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

Existe-t-il un moyen facile de renommer le champ "supplémentaire" en "dernier" dans tous les documents? J'ai vu l'opérateur $rename dans la documentation mais je ne suis pas vraiment clair sur la façon de spécifier un sous-champ.

169
demandé sur felipsmartins 2012-02-13 05:03:59

6 réponses

, Vous pouvez utiliser:

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

Ou simplement mettre à jour les documents qui contiennent la propriété:

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

Le false, true dans la méthode ci-dessus sont: { upsert:false, multi:true }. Vous avez besoin du multi:true pour mettre à jour Tous vos enregistrements.

Ou vous pouvez utiliser l'ancienne façon:

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

Dans MongoDB 3.2 vous pouvez également utiliser

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

La syntaxe générale de ceci est

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

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

326
répondu Felix Yan 2018-03-13 18:37:10

S'il vous plaît essayer db.collectionName.update({}, { $rename : { 'name.additional' : 'name.last' } }, { multi: true } )

Et lisez ceci :) http://docs.mongodb.org/manual/reference/operator/rename/#_S_rename

45
répondu Alex 2013-02-14 13:45:56

Si jamais vous devez faire la même chose avec mongoid:

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

Mise à jour

Il y a un changement dans la syntaxe dans monogoid 4.0.0:

Model.all.rename(old_field: :new_field)
14
répondu metakungfu 2017-03-30 16:43:51

N'importe qui pourrait utiliser cette commande pour renommer un champ de la collection (en n'utilisant aucun _id):

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

Voir FYI

1
répondu Mants 2016-07-20 12:39:49

CE code nodejs fait juste cela, comme @ Felix Yan a mentionné l'ancienne façon semble fonctionner très bien, j'ai eu quelques problèmes avec d'autres snipets en espérant que cela aide.

Cela renommera la colonne "oldColumnName" en "newColumnName" de la table "documents"

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
répondu d1jhoni1b 2016-10-24 03:48:46

Je suis l'aide ,Mongo 3.4.0

L'opérateur $ rename met à jour le nom d'un champ et a la forme suivante:

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

Par exemple

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

Le nouveau nom de champ doit différer du nom de champ existant. Pour spécifier a dans un document intégré, utilisez la notation par points.

Cette opération renomme le champ nmae pour nommer tous les documents de la collection:

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

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

Dans la méthode ci-dessus false, true sont: { upsert: false, multi: true }. pour mettre à jour tous vos enregistrements, Vous avez besoin du multi:vrai.

Renommer un Champ dans un Document Incorporé

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

Utiliser le lien: https://docs.mongodb.com/manual/reference/operator/update/rename/

0
répondu Swapnil Shirke 2017-12-04 08:59:29