Upsert 기능은 업데이트 방법에서 훌륭하지만 한 가지 큰 단점이있는 것 같고 합리적인 해결책을 찾을 수 없습니다.
문제는 쿼리 기준과 일치하는 결과가 있지만 행이없는 경우 하나의 필드 만 업데이트하고 싶습니다. 많은 필드를 삽입하고 싶습니다.
예를 들어 find ({name : John, surname : Connor}) 가 결과를 반환하면 {age : 33} 와 같이 그에게 새로운 나이 만 설정하고 싶지만 결과가 없으면 많은 필드를 삽입하고 싶습니다. like {이름 : John, 성 : Connor, 나이 : 32, 역할 : 사령관, 캐릭터 : 신중함, 취미 : '터미네이터 죽이기'}
하나의 쿼리에서 이것을 달성하는 예쁜 방법이 있습니까? 아니면 유일한 해결책은 스트레이 포워드 (straighforward)입니다. 즉, 찾은 결과 수를 찾아서 확인하고이를 기반으로 삽입 또는 업데이트합니까?
편집 : 나는 이것을 한 단계로 만드는 능력의 필요성을 설명하기 위해 추가했습니다. 두 단계 (먼저 찾기 후 삽입 / 업데이트)로 만드는 솔루션은 하나를 찾고 업데이트 / 삽입하는 작업을 수행 할 때 좋지만이를 수행하려는 작업자가 1000 명 정도일 경우 실패합니다. 이름 -Surname 쌍에 대한 고유 색인을 작성하지 않는 한 (처음 몇 명의 작업자가 결과를 찾지 못하고 모두가 새 행을 삽입 할 때) 데이터베이스에 많은 John Connors가있을 수 있습니다. 그러나 나는 그렇게하지 않는 해결책을 찾고 있습니다.
문서에있는 정확한 값을 사용하여 특정 문서를 선택하는 데 충분한 기준을 일치시켜야하며 , 문서가 아직없는 경우 문서를 작성하는 데 필요한 모든 데이터 를 전송 해야 합니다. 또한 upsert
문서가없는 경우 문서를 만드는 옵션 을 지정해야 합니다.
update( {name: "John", surname: "Connor" },
{ $set :
{name: "John", surname: "Connor", age: 32, terminated: false}},
{ upsert: true })
사용의 본질도 이해해야합니다 upsert
. 쿼리는 고유 한 필드에 의존해야합니다. 그렇지 않으면 일치하는 데이터가있는 여러 문서로 끝날 수 있습니다.
경고 동일한 문서를 두 번 이상 삽입하지 않으려면 쿼리 필드가 고유하게 인덱싱 된 경우에만 upsert : true를 사용하십시오.
MongoDB는 쿼리 결과에 따라 문서의 일부만 조건부로 업데이트하는 방법을 지원하지 않습니다. 다음 을 허용하는 것은 없습니다 .
updateIf(query, updateIfTrue, updateIfFalse, options)
부분을 선택적으로 업데이트하려면 여러 단계를 수행하거나을 사용하여 전체 문서를 업데이트해야합니다 $set
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다