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.
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/
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
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)
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!");
}
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/