2016-06-01 4 views
0

나는 멱등 원을 만들고 싶다는 REST API를 작성 중입니다. 나는 중첩 된 배열과 멱등 원과 함께 지금 고심하고있다. 하나의 원자 적 조작으로 product_notes 배열의 항목을 업데이트하고 싶습니다. MongoDB에서 가능합니까? 또는 객체 대신 배열을 저장해야합니까 (이 게시물의 끝 부분에있는 예를 참조하십시오)? 예를 들어 upsert 동작을 모방하는 것이 가능하지만 배열을 모방 할 수 있습니까?MongoDB 중첩 배열의 멱등 원? 가능합니까?

{ 
username: "test01", 
product_notes: [ 
    { product_id: ObjectID("123"), note: "My comment!" }, 
    { product_id: ObjectID("124"), note: "My other comment" } ] 
} 

난 그냥 업데이트 명령과 $set하지만 무엇 product_id 아직 배열에없는 경우를 사용하여 기존 product_node에 대한 메모를 업데이트합니다. 그렇다면 upsert을하고 싶습니다만, (필자가 아는 한) 임베디드 문서/배열 연산자의 일부가 아닙니다.

이 문제를 해결하고 멱등수가되도록하는 한 가지 방법은 product_idusername 사이에 새 컬렉션 product_notes을 추가하는 것입니다. 이것은 문서 기반 데이터베이스의 목적을 위반하는 것처럼 느껴집니다.

또 다른 해결책이에 대해 아무것도 나보다 더 경험이 조금 공유 할 수

{ 
username: "test01", 
product_notes: { 
    "123": { product_id: ObjectID("123"), note: "My comment!" }, 
    "124": { product_id: ObjectID("124"), note: "My other comment" } } 
} 

누구?

+0

사용자는 몇 개의 댓글을 저장할 수 있습니까? 몽고 버전? – profesor79

+0

나는 당신이 무엇을 목표로하고 있는지 알고 있다고 생각합니다. 그러나 스키마 디자인을 염두에 두지 말고 스키마를 모델링하는 올바른 방법인지는 모릅니다. 10 ~ 100 개 제품이 될 것이라고 생각합니다. 표시된 코드는 정확한 프로젝트가 아니라 문제가있는 곳의 예입니다. 나는 이미 자체 컬렉션에서 product_notes로 솔루션을 만들었으며 ... 잘 작동합니다. –

답변

0

귀하의 요구 사항을 이해하면 사용자에게 고유 한 제품 ID (배열)를 저장하고자한다는 것입니다.

당신은 "사용자 이름"과 "username.product_id"상의 복합 고유 인덱스를 만들 수 있습니다. 따라서 동일한 제품 ID가 배열에 삽입되면 서비스가 멱등 원일 때 코드에서 catch하고 처리 할 수있는 예외가 생깁니다.

새로운 요소를 배열 (즉, product_notes)에 추가하는 측면에서, 기본 키 (즉, 최상위 속성 - 예제 "_id")로 문서를 가져와야하는 Spring 데이터를 사용한 다음 새로운 요소를 배열에 추가하고 문서를 업데이트하십시오. 기존의 배열 요소의 속성을 업데이트하는 측면에서

: - 올바른 제품 ID 찾기

  • -

    다시
    1. , 기본 키 ( 예 "_id"즉 최고 수준의 속성)에 의해 문서를 얻을 어레이 데이터를
    2. 을 반복함으로써 발생은 "[]"어레이 발생 바꾸기

      product_notes.[].note 
      
  • 관련 문제