Come posso rinominare un campo per tutti i documenti in MongoDB?


223

Supponendo che io abbia una collezione in MongoDB con 5000 dischi, ognuno contenente qualcosa di simile a:

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

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

Risposte:


423

Puoi usare:

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

O semplicemente aggiornare i documenti che contengono la proprietà:

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

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

Oppure puoi usare il modo precedente:

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 puoi anche usare

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/


52
Basta una parola per se si sta sbattere la testa contro il muro perché nulla è messa aggiornamento: il false, truenel updatemetodo della $renameversione sono: { upsert:false, multi:true }. È necessario multi:trueper aggiornare tutti i record.
Ricky,

1
e se sto ottenendo upsert:truecreerà il nome del campo se il nome del campo non esiste, per impostazione predefinita false.
IGRACH,

1
Per qualche motivo, questo non ha funzionato per me quando ho usato la "table.field" : "table.field"sintassi. Ha funzionato quando ho appena usato la "field" : "field"sintassi.
Ben

@Steve name.lastno table.field. Se leggi la domanda, puoi vedere che il namecampo contiene un oggetto.
Marc Dingena,

Funziona anche con le matrici? Posso fare db.foo.update({}, {$rename:{"name.0.additional":"name.0.last"}}, false, true):?
bncc,

49

vi preghiamo di provare db.collectionName.update({}, { $rename : { 'name.additional' : 'name.last' } }, { multi: true } )

e leggi 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 upserte multi.
Akos K,

1
Secondo la nuova documentazione, dovrebbe apparire come: db.collectionName.updateMany ({}, {$ rename: {'name.additional': 'name.last'}})
1r3k

15

Se mai dovessi fare la stessa cosa con mongoid:

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

AGGIORNARE

C'è un cambiamento nella sintassi in monogoid 4.0.0:

Model.all.rename(old_field: :new_field)

11
C'è un cambiamento nella sintassi nell'ultimo monogoide (4.0.0)Model.all.rename(old_field: :new_field)
Calin,

Come posso utilizzare questa opzione per il documento incorporato
Huzaifa Saifuddin,

2

Chiunque potrebbe potenzialmente utilizzare questo comando per rinominare un campo dalla raccolta (non utilizzando alcun _id):

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

vedi FYI


0

Questo codice nodejs lo fa e basta, dato che @Felix Yan menzionato in precedenza sembra funzionare bene, ho avuto alcuni problemi con altri snipet spero che questo aiuti.

Questo rinominerà la colonna "oldColumnName" in "newColumnName" della tabella "documenti"

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

Sto usando Mongo 3.4.0

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

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

per es

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

Il nome del nuovo campo deve differire dal nome del campo esistente. Per specificare un in un documento incorporato, usare la notazione punto.

Questa operazione rinomina il campo nmae come nome per tutti i documenti della raccolta:

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, multi: true}. Per aggiornare tutti i record, è necessario il multi: true.

Rinomina un campo in un documento incorporato

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

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


L'opzione di incorporamento non funziona ... Ottengo questo errore "Impossibile utilizzare la parte (indirizzo di address.city) per attraversare l'elemento"
Huzaifa Saifuddin

0

Se stai usando MongoMapper, funziona:

Access.collection.update( {}, { '$rename' => { 'location' => 'location_info' } }, :multi => true )
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.