Come cambiare il tipo di dati del campo nidificato nel documento Mongo?

La mia struttura Mongo come sotto,

"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" } ] 

Ora nei documenti precedenti topProcesses.cpuUtilizationPercent è in stringa e volevo modificare il tipo di dati topProcesses.cpuUtilizationPercent su Float . Per questo ho provato di seguito ma non ha funzionato

 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); } }) 

Qualcuno può aiutare a come cambiare la stringa in float nei documenti Mongo annidati

Lo stai facendo nel modo giusto ma non hai incluso l’elemento dell’array in modo che corrisponda alla porzione di query di .update() :

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

Quindi è necessario abbinare qualcosa nell'array in modo che l'operatore $ posizionale abbia alcun effetto.

Potresti anche aver usato il valore "indice" nella notazione, poiché lo stai producendo comunque in un ciclo:

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

Che utilizza solo l'indice di corrispondenza ed è utile laddove non esiste un identificatore univoco dell'elemento dell'array.

Si noti inoltre che né le opzioni "upsert" o "multi" dovrebbero essere applicate qui a causa della natura di come questi processi sono documenti esistenti.


Proprio come una nota "postscript" a questo, vale anche la pena considerare l'API Bulk Operations di MongoDB nelle versioni dalla 2.6 in poi. Utilizzando questi metodi API è ansible ridurre in modo significativo la quantità di traffico di rete tra l'applicazione client e il database. L'evidente miglioramento qui è nella velocità generale:

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

Ciò riduce sostanzialmente la quantità di istruzioni di operazioni inviate al server per inviare solo una volta ogni 1000 operazioni in coda. Puoi giocare con quel numero e come le cose sono raggruppate, ma darà un significativo aumento della velocità in un modo relativamente sicuro.

è ansible utilizzare sotto la query per aggiornare il tipo di dati di topProcesses.cpuUtilizationPercent da stringa a float

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