복붙노트

[MONGODB] 어떻게 특정 필드를 기반으로 배열에 고유 한 항목을 보장하기 위해 - MongoDB를을?

MONGODB

어떻게 특정 필드를 기반으로 배열에 고유 한 항목을 보장하기 위해 - MongoDB를을?

내 시나리오에는에서는 컬렉션의 저자가, 각 저자는 메시지를 가지고 있으며, 저자 캔의 각 메시지 이벤트가 있습니다. 각각의 배우가 한 번 행동의 한 종류를 수행 할 수.

db.people.ensureIndex({messages.messageEvents.eventName: 1, messages.messageEvents.actorId: 1}, {unique: true});

나는 인덱스를 추가하지만 아무런 영향을 미치지 않습니다. "투표"와 "actorId": "1234"내 제약에 대해해야한다 아래 보시다시피, 내 문서는 "EVENTNAME"이 세 가지 요소가 있습니다.

어떻게 EVENTNAME 및 actorId 필드를 기반으로 messageEvents 배열의 고유 한 항목을 보장하기 위해?

사실, 나는 그것을 거부하는 대신 두 번째 검색 및 업데이트 이벤트없이 기존 항목을 업데이트해야합니다.

{
  "_id": "1234567",
  "authorPoint": 0,
  "messages": [
    {
      "messageId": "112",
      "messageType": "Q",
      "messagePoint": 0,
      "messageEvents": [
        {
          "eventName": "Add",
          "actorId": "1234",
          "detail": ""
        },
        {
          "eventName": "Vote",
          "actorId": "1234",
          "detail": "up"
        },
        {
          "eventName": "Vote",
          "actorId": "1234",
          "detail": "down"
        },
        {
          "eventName": "Vote",
          "actorId": "1234",
          "detail": "cork"
        }
      ]
    }
  ]
}

해결법

  1. ==============================

    1.그들이 컬렉션의 문서들 사이에서 시행하고 있지만 무스타파, 고유 제한 조건은 단일 어레이 내에서 적용되지 않습니다. 이것은 잠시 동안 고정되지 않습니다 알려진 버그 :

    그들이 컬렉션의 문서들 사이에서 시행하고 있지만 무스타파, 고유 제한 조건은 단일 어레이 내에서 적용되지 않습니다. 이것은 잠시 동안 고정되지 않습니다 알려진 버그 :

    https://jira.mongodb.org/browse/SERVER-1068

    해결 방법이 있긴합니다. 장소에 고유 인덱스를 유지하고 :

    1) 배열의 중복 값을 새 문서를 삽입하지 않는 응용 프로그램을 확인합니다. 당신은 삽입하기 전에 응용 프로그램 코드에서 고유성을 확인할 수 있습니다.

    2) 업데이트 기존 문서는 $ 푸시 대신 $ addToSet를 사용하는 경우.

  2. from https://stackoverflow.com/questions/10383143/how-to-ensure-unique-item-in-an-array-based-on-specific-fields-mongodb by cc-by-sa and MIT license