2017-01-03 3 views
0

componentId와 wfInstanceId id가 일치하면 'fields'배열의 유형, 키 및 값을 업데이트해야합니다.중첩 배열 안의 몽구스 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를 통해 $ push를 시도해도 작동하지 않습니다. 그들이이 DOC에서 설명하는 것처럼

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

은 또한 나를 위해 작동하지 않았다되는 업데이트 방법에 대한 작업 shouldbe. 어떤 도움도 내가 직면하고있는이 문제를 극복하기 위해 정말로 높이 평가 될 것입니다.

답변

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

. 나는 그것이 몽고 초보자에게 더 분명하다고 생각한다.

+0

헤이 샘이 나던 일 :( – d7k

+0

무슨 오류 – Sam

+0

이 Model.save이 doc.save()를 할 몽구스의 기능 – d7k