2012-02-13 15 views
151

Supponendo che ho una collezione in MongoDB con 5000 registrazioni, ciascuna contenente qualcosa di simile a:Come posso rinominare un campo per tutti i documenti in MongoDB?

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

C'è un modo semplice per rinominare il campo "aggiuntivo" a "ultimo" in tutti i documenti? Ho visto l'operatore $rename nella documentazione, ma non sono molto chiaro su come specificare un sottocampo.

risposta

286

È possibile utilizzare:

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

Il false, true nel metodo di cui sopra sono: { upsert:false, multi:true }. È necessario il multi:true per aggiornare tutti i record.

In alternativa è possibile utilizzare il precedente modo:

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 è anche possibile utilizzare

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

La sintassi generale di questo è

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

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

+0

Grazie! Ho modificato la mia risposta per correggere questo. –

+43

Solo una parola per se stai sbattendo la testa contro il muro perché nulla viene aggiornato in massa: il 'false, true' nel metodo' update' della versione '$ rename' sono:' {upsert: false, multi: true } '. Hai bisogno di 'multi: true' per aggiornare tutti i tuoi record. – RickyA

+1

e se lo sto ottenendo 'upsert: true' creerà il nome del campo se il nome del campo non esiste, il valore predefinito è' false'. – IGRACH

44

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

e leggere questo :) http://docs.mongodb.org/manual/reference/operator/rename/#_S_rename

+1

Aggiorna il link, sembra che la nuova documentazione non dica nulla sulle opzioni 'upsert' e' multi'. –

+0

Secondo la nuova documentazione, dovrebbe essere simile a: db.collectionName.updateMany ({}, {$ rinomina: {'name.additional': 'name.last'}}) – 1r3k

12

Se mai avete bisogno di fare la stessa cosa con mongoid:

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

UPDATE

C'è modifica della sintassi in monogoid 4.0.0:

Model.all.rename(old_field: :new_field) 
+10

C'è una modifica nella sintassi nell'ultimo monogoid (4.0.0) 'Model.all.rename (old_field:: new_field)' – Calin

1

Chiunque potrebbe potenzialmente utilizzare questo comando per rinominare un campo da collezione (Non utilizzando alcun _id):

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

vedere FYI

0

Questo nodejs codice appena farlo, come @ Felix Yan citato in precedenza sembra funzionare bene, ho avuto alcuni problemi con altri cecchini sperando che questo aiuti.

Ciò rinominare colonna "oldColumnName" essere "newColumnName" di tabella "documenti"

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

sto usando, Mongo 3.4.0

L'operatore $ rename aggiorna il nome di un campo e ha il seguente formato:

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

per e.g

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

Il nuovo nome campo deve essere diverso dal nome del campo esistente. Per specificare un in un documento incorporato, utilizzare la notazione a punti.

Questa operazione rinomina il Nmae campo per nome per tutti i documenti della collezione:

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

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

Nel metodo sopra false, true sono: {upsert: false, a più: true} .Per aggiornare tutti i record , Hai bisogno del multi: vero.

rinominare un campo in un documento incorporato

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

uso link: https://docs.mongodb.com/manual/reference/operator/update/rename/

Problemi correlati