¿Cómo cambiar el tipo de datos del campo nested en el documento de Mongo?

Mi estructura de Mongo como a continuación,

"topProcesses" : [ { "cpuUtilizationPercent" : "0.0", "processId" : "1", "memoryUtilizationPercent" : "0.1", "command" : "init", "user" : "root" }, { "cpuUtilizationPercent" : "0.0", "processId" : "2", "memoryUtilizationPercent" : "0.0", "command" : "kthreadd", "user" : "root" }, { "cpuUtilizationPercent" : "0.0", "processId" : "3", "memoryUtilizationPercent" : "0.0", "command" : "ksoftirqd/0", "user" : "root" }, { "cpuUtilizationPercent" : "0.0", "processId" : "5", "memoryUtilizationPercent" : "0.0", "command" : "kworker/0:+", "user" : "root" }, { "cpuUtilizationPercent" : "0.0", "processId" : "6", "memoryUtilizationPercent" : "0.0", "command" : "kworker/u3+", "user" : "root" }, { "cpuUtilizationPercent" : "0.0", "processId" : "8", "memoryUtilizationPercent" : "0.0", "command" : "rcu_sched", "user" : "root" } ] 

Ahora, en los documentos anteriores, topProcesses.cpuUtilizationPercent está en cadena y quería cambiar el tipo de datos topProcesses.cpuUtilizationPercent a Float . Para esto probé a continuación, pero no funcionó

 db.collectionName.find({ "topProcesses":{"$exists":true}}).forEach(function(data){ for(var ii=0;ii<data.topProcesses.length;ii++){ db.collectionName.update({_id: data._id},{$set:{"topProcesses.$.cpuUtilizationPercent":parseFloat(data.topProcesses[ii].cpuUtilizationPercent)}},false,true); } }) 

¿Alguien puede ayudar a cambiar la cuerda para flotar en documentos nesteds de Mongo?

Lo está haciendo de la manera correcta, pero no incluyó el elemento de matriz para que coincida en la parte de consulta de .update() :

 db.collectionName.find({ "topProcesses":{"$exists":true}}).forEach(function(data){ for(var ii=0;ii 

Por lo tanto, debe hacer coincidir algo en la matriz para que el $ operador posicional tenga algún efecto.

También podría haber utilizado el valor de "índice" en la notación, ya que está produciendo eso en un bucle de todos modos:

 db.collectionName.find({ "topProcesses":{"$exists":true}}).forEach(function(data){ for(var ii=0;ii 

Que solo usa el índice coincidente y es útil cuando no hay un identificador único del elemento de la matriz.

También tenga en cuenta que ni las opciones "upsert" o "multi" deben aplicarse aquí debido a la naturaleza de cómo se procesan los documentos existentes.


Al igual que una nota de "postscript" a esto, también vale la pena considerar la API de operaciones masivas de MongoDB en las versiones de 2.6 y posteriores. Al usar estos métodos API, puede reducir significativamente la cantidad de tráfico de red entre su aplicación cliente y la base de datos. La mejora obvia aquí está en la velocidad general:

 var bulk = db.collectionName.initializeOrderedBulkOp(); var counter = 0; db.collectionName.find({ "topProcesses":{"$exists":true}} ).forEach(function(data){ for(var ii=0;ii 

Esto básicamente reduce la cantidad de instrucciones de operaciones enviadas al servidor para enviar solo una vez cada 1000 operaciones en cola. Puede jugar con ese número y cómo se agrupan las cosas, pero dará un aumento significativo en la velocidad de una manera relativamente segura.

puede utilizar la consulta a continuación para actualizar el tipo de datos de topProcesses.cpuUtilizationPercent de la cadena a flotar

 db.db.find({"topProcesses.cpuUtilizationPercent" : {$exists : true}}). forEach( function(obj) { obj.topProcesses.cpuUtilizationPercent = new ISODate(obj.topProcesses.cpuUtilizationPercent); db.db.save(obj); } );