Necesito actualizar todos los documentos de una colección pero con un valor diferente según la condición usando MongoDB. Aquí está mi colección:
usuarios_db:
{ "_id" : ObjectId("4e93037bbf6f1dd3a0a9541a"), "device_type" : "Android" }, { "_id" : ObjectId("4e93037bbf6f1dd3a0a9541b"), "device_type" : " " } Aquí necesito agregar una columna adicional ( ie-version ) para cada documento y también actualizar version=1.0 cuando "device_type": "Android" y version='' cuando "device_type": " ".
Necesito consulta para esto.
Creo que no puede haber una sola consulta para hacer dos tipos de operaciones, pero podría haber dos consultas
db.db_users.update({'device_type':"Android"},{$set : {'version':"1.0"}},{multi:true}); db.db_users.update({'device_type':""},{$set : {'version':""}},{multi:true});también en el documento muestra un espacio en blanco " ", mientras que en cuestión lo mencionaste "". si no es consistente, debe usar $or.
También se puede hacer a través de un solo script.
db.db_users.find().forEach(function(doc){if(doc.device_type && doc.device_type==='Android'){doc.version="1.0"}else{doc.version=""} db.db_users.save(doc)});si hay una lógica múltiple, es mejor optar por el script, si solo está limitado, como mencionó en su pregunta, serían preferibles dos actualizaciones.
Para MongoDB 3.4 y posteriores:
Usando el marco de agregación, la $addFields y $out actualizaría su colección con una sola operación agregada. Por ejemplo:
db.users.aggregate([ { "$addFields": { "version": { "$switch": { "branches": [ { "case": { "$eq": ["$device_type", "Android"] }, "then": "1.0" }, { "case": { "$eq": ["$device_type", " "] }, "then": "" } ] } } } }, { "$out": "users" } ])Para MongoDB 3.2 :
Puede utilizar los métodos bulkWrite para actualizaciones más rápidas y eficientes. Considere la siguiente operación:
var ops = []; db.users.aggregate([ { "$project": { "version": { "$cond": [ { "$eq": ["$device_type", "Android"] }, "1.0", "" ] } } } ]).forEach(function(doc){ ops.push( { "updateOne": { "filter": { "_id": doc._id }, "update": { "$set": { "version": doc.version } } } }); if (ops.length === 500) { // Execute per 500 operations and re-initialise db.users.bulkWrite(ops); ops = []; } }) if (ops.length > 0) { db.users.bulkWrite(ops); }Para MongoDB <= 3.0 y >= 2.6 :
var bulk = db.users.initializeUnorderedBulkOp(); var count = 0; db.users.aggregate([ { "$project": { "version": { "$cond": [ { "$eq": ["$device_type", "Android"] }, "1.0", "" ] } } } ]).forEach(function(doc) { bulk.find({ "_id": doc._id }).updateOne({ "$set": { "version": doc.version } }); count++; if (count % 500 === 0) { // Excecute per 500 operations and re-initialise bulk.execute(); bulk = db.users.initializeUnorderedBulkOp(); } }) // clean up remaining operations in queue if (count > 0) { bulk.execute(); }