MongoDB: Como mudar o tipo de um campo?

Já existe uma pergunta no Stackoverflow, muito parecida com a minha pergunta. A questão é que a resposta para essas perguntas era para um driver Java, estou tentando fazer isso no shell.

Eu estou fazendo isso …

db.meta.update({'fields.properties.default': { $type : 1 }}, {'fields.properties.default': { $type : 2 }}) 

Isto não está a funcionar!

A única maneira de alterar o $type dos dados é executar uma atualização nos dados em que os dados têm o tipo correto.

Neste caso, parece que você está tentando mudar o $type de 1 (double) para 2 (string) .

Portanto, basta carregar o documento do database, executar o lançamento ( new String(x) ) e salvar o documento novamente.

Se você precisar fazer isso programaticamente e inteiramente a partir do shell, você pode usar a syntax find(...).forEach(function(x) {}) .


Em resposta ao segundo comentário abaixo. Altere o campo bad de um número para uma cadeia na coleção foo .

 db.foo.find( { 'bad' : { $type : 1 } } ).forEach( function (x) { x.bad = new String(x.bad); // convert field to string db.foo.save(x); }); 

Converter o campo String para Integer:

 db.db-name.find({field-name: {$exists: true}}).forEach(function(obj) { obj.field-name = new NumberInt(obj.field-name); db.db-name.save(obj); }); 

Converter campo inteiro em string:

 db.db-name.find({field-name: {$exists: true}}).forEach(function(obj) { obj.field-name = "" + obj.field-name; db.db-name.save(obj); }); 

Para string para conversão int.

 db.my_collection.find().forEach( function(obj) { obj.my_value= new NumberInt(obj.my_value); db.my_collection.save(obj); }); 

Para string para duplicar a conversão.

  obj.my_value= parseInt(obj.my_value, 10); 

Para float:

  obj.my_value= parseFloat(obj.my_value); 
 db.coll.find().forEach(function(data) { db.coll.update({_id:data._id},{$set:{myfield:parseInt(data.myfield)}}); }) 

O que realmente me ajudou a mudar o tipo de object no MondoDB foi apenas essa linha simples, talvez mencionada antes aqui …:

 db.Users.find({age: {$exists: true}}).forEach(function(obj) { obj.age = new NumberInt(obj.age); db.Users.save(obj); }); 

Usuários são minha coleção e age é o object que possui uma string ao invés de um inteiro (int32).

Para converter int32 para string no mongo sem criar um array basta adicionar “” ao seu número 🙂

 db.foo.find( { 'mynum' : { $type : 16 } } ).forEach( function (x) { x.mynum = x.mynum + ""; // convert int32 to string db.foo.save(x); }); 

Para converter um campo do tipo string para o campo date, você precisaria iterar o cursor retornado pelo método find() usando o método forEach() , dentro do loop converter o campo para um object Date e então atualizar o campo usando o $set operador $set .

Aproveite o uso da API em massa para atualizações em massa que oferecem melhor desempenho, pois você enviará as operações para o servidor em lotes de 1000, o que proporciona um melhor desempenho, pois você não está enviando todas as solicitações ao servidor, apenas uma vez em cada 1000 pedidos.

O seguinte demonstra essa abordagem, o primeiro exemplo usa a API em massa disponível nas versões do MongoDB >= 2.6 and < 3.2 . Ele atualiza todos os documentos da coleção, alterando todos os campos created_at para date:

 var bulk = db.collection.initializeUnorderedBulkOp(), counter = 0; db.collection.find({"created_at": {"$exists": true, "$type": 2 }}).forEach(function (doc) { var newDate = new Date(doc.created_at); bulk.find({ "_id": doc._id }).updateOne({ "$set": { "created_at": newDate} }); counter++; if (counter % 1000 == 0) { bulk.execute(); // Execute per 1000 operations and re-initialize every 1000 update statements bulk = db.collection.initializeUnorderedBulkOp(); } }) // Clean up remaining operations in queue if (counter % 1000 != 0) { bulk.execute(); } 

O próximo exemplo se aplica à nova versão 3.2 MongoDB, que suspendeu a API em massa e forneceu um novo conjunto de apis usando bulkWrite() :

 var bulkOps = []; db.collection.find({"created_at": {"$exists": true, "$type": 2 }}).forEach(function (doc) { var newDate = new Date(doc.created_at); bulkOps.push( { "updateOne": { "filter": { "_id": doc._id } , "update": { "$set": { "created_at": newDate } } } } ); }) db.collection.bulkWrite(bulkOps, { "ordered": true }); 

Eu preciso alterar o tipo de dados de vários campos na coleção, então usei o seguinte para fazer várias alterações de tipo de dados na coleção de documentos. Responda a uma pergunta antiga, mas pode ser útil para outras pessoas.

 db.mycoll.find().forEach(function(obj) { if (obj.hasOwnProperty('phone')) { obj.phone = "" + obj.phone; // int or longint to string } if (obj.hasOwnProperty('field-name')) { obj.field-name = new NumberInt(obj.field-name); //string to integer } if (obj.hasOwnProperty('cdate')) { obj.cdate = new ISODate(obj.cdate); //string to Date } db.mycoll.save(obj); }); 
 You can easily convert the string data type to numerical data type. Don't forget to change collectionName & FieldName. for ex : CollectionNmae : Users & FieldName : Contactno. 

Tente esta consulta ..

 db.collectionName.find().forEach( function (x) { x.FieldName = parseInt(x.FieldName); db.collectionName.save(x); }); 

Eu uso este script no console mongodb para string para flutuar as conversões …

 db.documents.find({ 'fwtweaeeba' : {$exists : true}}).forEach( function(obj) { obj.fwtweaeeba = parseFloat( obj.fwtweaeeba ); db.documents.save(obj); } ); db.documents.find({ 'versions.0.content.fwtweaeeba' : {$exists : true}}).forEach( function(obj) { obj.versions[0].content.fwtweaeeba = parseFloat( obj.versions[0].content.fwtweaeeba ); db.documents.save(obj); } ); db.documents.find({ 'versions.1.content.fwtweaeeba' : {$exists : true}}).forEach( function(obj) { obj.versions[1].content.fwtweaeeba = parseFloat( obj.versions[1].content.fwtweaeeba ); db.documents.save(obj); } ); db.documents.find({ 'versions.2.content.fwtweaeeba' : {$exists : true}}).forEach( function(obj) { obj.versions[2].content.fwtweaeeba = parseFloat( obj.versions[2].content.fwtweaeeba ); db.documents.save(obj); } ); 

E este em php)))

 foreach($db->documents->find(array("type" => "chair")) as $document){ $db->documents->update( array('_id' => $document[_id]), array( '$set' => array( 'versions.0.content.axdducvoxb' => (float)$document['versions'][0]['content']['axdducvoxb'], 'versions.1.content.axdducvoxb' => (float)$document['versions'][1]['content']['axdducvoxb'], 'versions.2.content.axdducvoxb' => (float)$document['versions'][2]['content']['axdducvoxb'], 'axdducvoxb' => (float)$document['axdducvoxb'] ) ), array('$multi' => true) ); } 

demo mudar tipo de campo mid de string para mongo objectId usando mongoose

  Post.find({}, {mid: 1,_id:1}).exec(function (err, doc) { doc.map((item, key) => { Post.findByIdAndUpdate({_id:item._id},{$set:{mid: mongoose.Types.ObjectId(item.mid)}}).exec((err,res)=>{ if(err) throw err; reply(res); }); }); }); 

O Mongo ObjectId é apenas outro exemplo de estilos como

Número, string, booleano que espera que a resposta ajude alguém.