2017-12-26 7 views
0

mongodb를 사용하는 express로 app을 개발 중입니다. 삽입 및 데이터를 업데이 트 코드를 쓴 괜찮 았던 방법을 사용하여 저장합니다. 내가 데이터를 업데이트하는 경우mongodb의 save 메소드를 사용하여 특정 필드 업데이트하기

작동 코드는

dbconnect.collection('profiles').save(data, function (err, result) { 
      if (err) 
       return res.send({ success: false, message: "Error saving into database" }); 
      result = JSON.parse(JSON.stringify(result)); 
      if (_.isEmpty(result) || !result.ok) 
       return res.send({ success: false, message: "Unidentified error." }) 
      return res.send({ success: true }); 
     }); 

, 전체 문서가 업데이트지고 있습니다. 그 말대로 예. 그러나 나는 그것에서 하나의 필드를 생략하고 싶다.

하자 그것은 새로운 _id를 생성하고 문서를 삽입, 내가 _id없이 통과하면 내 필드

username, password, email, postal_address 

을 말할.

사용자가 postal_address를 업데이트하려고하는 경우 데이터에 암호 필드가 없으므로 암호가 삭제됩니다. 그것은 전체 문서를 다시 작성하는 것과 같습니다.

코드가 작성되었으며 삽입 및 업데이트로 코드를 두 부분으로 나누고 싶지 않으므로 저장 방법을 사용하여 문서의 일부를 업데이트 할 수있는 방법을 찾고 있습니다.

희망 사항을 명확히했습니다.

+1

'upsert' 옵션으로'update'를 사용할 수도 있습니다. 그래서 그것은 여전히 ​​한 단계 일 것입니다. – Josh

+0

[여기] (https://docs.mongodb.com/manual/reference/method/db.collection.update/#upsert-option) – Josh

+0

나는 내 코드를 마침내 분할했다. 시간을내어 주셔서 감사합니다. –

답변

1

질문을 올바르게 이해하면 삽입 및 업데이트에 여러 명령을 사용하고 싶지 않습니다.

upsert 옵션을 true로 설정하여 업데이트 명령을 사용할 수 있습니다. 일부 쿼리 선택기를 사용하여 문서를 찾을 수 있으며 업데이트 개체에 "$set""$setOnInsert" 연산자를 사용할 수 있습니다.

"$setOnInsert"은 일부 사용자 지정 논리에 필드를 추가하는 데 사용할 수 있습니다. 사용자 지정 논리는 문서가 업데이트되고 업데이트되지 않는 경우에만 적용됩니다.

db.collection.update(query, update, {upsert: true})

`db.products.update(
{ name: 'Apple' }, 
    { 
    $set: { item: "apple" }, 
    $setOnInsert: { defaultQty: 100 } 
    }, 
    { upsert: true } 
)` 

더 여기를 참조하십시오 MongoDB $setOnInsert 당신은 쿼리 선택에서 모든 필드를 제공하지 않습니다 때, 그것은 문서의 어느 것과도 일치하기 때문에 신중하게 쿼리 선택기를 선택해야

및 해당 특정 문서를 업데이트합니다. 그래서, 더 단단한 쿼리 선택기를 사용하여 요구 사항에 따라 쿼리 선택에 _id를 사용하지하고 upsert가 자동으로 _id를 만들 수 (또는 "$ setOnInsert"을 사용하여 _id 설정)이 도움이

희망을.

+0

불행히도 저는 참고 문헌으로 _id를 사용했습니다. 나는 그것을 바꾸고 싶지 않다. 그래서 나는 운동에 대한 참조를 할 수 없었다. 시간과 업데이트에 감사드립니다. –