web-dev-qa-db-fra.com

Comment 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 simple 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 sais pas trop comment spécifier un sous-champ.

184
soulkphp

Vous pouvez utiliser:

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

Ou simplement mettre à jour les docs contenant la propriété:

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

Les 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 méthode:

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/

352
Felix Yan

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

46
Alex

Si jamais vous avez besoin de faire la même chose avec mongoid: 

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

METTRE À JOUR

Il y a un changement de syntaxe dans monogoid 4.0.0:

Model.all.rename(old_field: :new_field)
15
metakungfu

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

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

voir FYI

1
Mants

Ce code de nœud ne fait que ça, comme @Felix Yan a mentionné que l’ancienne méthode semble bien fonctionner, j’ai eu quelques problèmes avec d’autres snipets espérant que cela aide.

Ceci 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:[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!");
}
0
d1jhoni1b

J'utilise, Mongo 3.4.0

L'opérateur $ rename met à jour le nom d'un champ et se présente sous 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 être différent du nom de champ existant. Pour spécifier un document incorporé, utilisez la notation par points.

Cette opération renomme le champ nmae en nommant 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: true.

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
Swadeshi

Si vous utilisez MongoMapper, cela fonctionne:

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