2017-01-03 53 views
0

如果componentId和wfInstanceId id匹配,我需要更新'fields'数组中的类型,键和值。嵌套数组中的Mongoose findOneAndUpdate

这是我需要这样做的文档。

{ 
    "_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 
} 

我试过这样,我也试过$设置$ push这也是行不通的。

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

当他们在这个DOC描述那么只能为还没有为我工作的更新方法工作。任何帮助将真正赞赏克服我面临的这个问题。

回答

1

当您使用$运营商在每个文档中仅更新第一匹配的数组元素。

截至目前,猫鼬不可能直接更新所有数组元素。

你可以在你的情况下做到这一点:

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

,这是正常的JavaScript代码。我认为mongo新手更清楚。

+0

嘿山姆,我不工作:( – d7k

+0

什么错误 – Sam

+0

它说Model.save不是一个函数 – d7k