Necesito actualizar el tipo, la clave y los valores en la matriz de 'campos' si el componenteId y el id de wfInstanceId coinciden.
Este es el documento que necesito para hacerlo.
{ "_id": { "$oid": "586b6d756937c22f207dd5af" }, "wfInstanceId": "0111", "workflowId": "ash3", "folderURL": "ash3", "teamName": "teamName", "dataStream": [ { "componentInstanceId": "componentInstanceId1", "componentId": "componentId1", "_id": { "$oid": "586b6d756937c22f207dd5b0" }, "fields": [ { "type": "String", "value": "value1", "key": "key", "_id": { "$oid": "586b6d756937c22f207dd5b1" } }, { "type": "String", "value": "value2", "key": "key1", "_id": { "$oid": "586b6d756937c22f207dd5b1" } } ] }, { "componentInstanceId": "componentInstanceId2", "componentId": "componentId22", "_id": { "$oid": "586b6d756937c22f207dd5b0" }, "fields": [ { "type": "String", "value": "value1", "key": "key", "_id": { "$oid": "586b6d756937c22f207dd5b1" } }, { "type": "String", "value": "value2", "key": "key2", "_id": { "$oid": "586b6d756937c22f207dd5b1" } } ] } ], "id": "38f356f0-d196-11e6-b0b9-3956ed7f36f0", "__v": 0 }Intenté esto así, también probé $set sobre $push, que tampoco funciona.
Model.findOneAndUpdate( {'wfInstanceId': '0111', 'dataStream.componentId': 'componentId1'}, {$push : { 'dataStream.fields.$.key' : 'sdsdds' }}, { upsert: true }, function (err, data) { if (err) { reject(err); console.log('error occured' + err); } console.info("succesfully saved"); resolve (data); });Como describen en este DOC , debería funcionar para el método de actualización que tampoco funcionó para mí. Cualquier ayuda será realmente apreciada para superar este problema que estoy enfrentando.
Como está utilizando el operador $ , actualiza solo el primer elemento de matriz coincidente en cada documento.
A partir de ahora, no es posible en mongoose actualizar directamente todos los elementos de la matriz.
Puedes hacer esto en tu caso:
db.collection.find({'wfInstanceId': '0111', 'dataStream.componentId': 'componentId1'}) .forEach(function (doc) { doc.datastream.forEach(function (datastream) { if (dataStream.componentId === componentId1) { dataStream.fields.forEach(function(fields){ // you can also write condition for matching condition in field dataStream.fields.key=""; dataStream.fields.value=""; dataStream.fields.type=""; } } }); db.collection.save(doc); });Es código javascript normal. Creo que es más claro para los novatos de mongo.