복붙노트

[MONGODB] MongoDB의 : 배열 요소의 특성에 고유 색인

MONGODB

MongoDB의 : 배열 요소의 특성에 고유 색인

나는이 유사한 구조를 가지고 :

class Cat {
  int id;
  List<Kitten> kittens;
}

class Kitten {
  int id;
}

나는 ID가 동일한 둘 이상의 고양이와 고양이를 생성하지 못하도록하고 싶습니다. 다음과 같이 나는 인덱스를 생성 시도했다 :

db.Cats.ensureIndex({'id': 1, 'kittens.id': 1}, {unique:true})

내가 심하게 형식의 고양이를 삽입하려고 할 때, 몽고는 그것을 받아들입니다.

나는 뭔가를 놓치고 있습니까? 이조차 할 수 있는가?

해결법

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

    1.이 중복 키 오류가 발생 할 수 있도록 지금까지 내가 아는 한, 고유 인덱스는 서로 다른 문서간에 고유성 적용 :

    이 중복 키 오류가 발생 할 수 있도록 지금까지 내가 아는 한, 고유 인덱스는 서로 다른 문서간에 고유성 적용 :

    db.cats.insert( { id: 123, kittens: [ { id: 456 } ] } )
    db.cats.insert( { id: 123, kittens: [ { id: 456 } ] } )
    

    하지만이 허용된다 :

    db.cats.insert( { id: 123, kittens: [ { id: 456 }, { id: 456 } ] } )
    

    나는 당신이 업데이 트의 삽입 할 때 어떤 방법, 응용 프로그램 로직에서 확인할 수 있습니다 어쩌면 그것의 무언가를 당신이 몽고 수준에서 필요로하는 제약 조건을 강제이 있다면 아니에요?

  2. ==============================

    2.어레이 필드의 개별 값의 고유성을 보장

    어레이 필드의 개별 값의 고유성을 보장

  3. ==============================

    3.어레이의 특성과 uniquness 인서트의 등가있다. 다음 명령은 기본적으로 새끼 고양이 (123 개체가 이미 존재하지 않는 경우 upsert 당신을 위해 그것을 생성)의 고유성을 유지하면서 삽입한다.

    어레이의 특성과 uniquness 인서트의 등가있다. 다음 명령은 기본적으로 새끼 고양이 (123 개체가 이미 존재하지 않는 경우 upsert 당신을 위해 그것을 생성)의 고유성을 유지하면서 삽입한다.

    db.cats.update(
      { id: 123 },
      { $addToSet: {kittens: { $each: [ 456, 456] }}, $set: {'otherfields': 'extraval', "field2": "value2"}},
      { upsert: true}
    )
    

    객체의 결과 값 것

    {
        "id": 123,
        "kittens": [456],
        "otherfields": "extraval",
        "field2": "value2"
    }
    
  4. ==============================

    4.이 경우 사용자 정의 몽구스 검증 방법을 쓸 수 있습니다. 당신은 사후 검증에 연결할 수 있습니다. 몽구스는 검증을 가지고 있으며, 당신은 (이전) 또는 후 (후) 확인 전에 후크를 구현할 수 있습니다. 이 경우, 배열이 유효 있는지 확인하기 위해 사후 검증을 사용할 수 있습니다. 그럼 그냥 있는지 확인 배열에는 중복이 없습니다. 당신이 당신의 세부 사항에 따라 만들 수 있습니다 효율성 향상이있을 수 있습니다. 당신은 단지 예를 들어 '_id'를하는 경우 당신은 단지 JS 기능이 포함되어 사용할 수 있습니다.

    이 경우 사용자 정의 몽구스 검증 방법을 쓸 수 있습니다. 당신은 사후 검증에 연결할 수 있습니다. 몽구스는 검증을 가지고 있으며, 당신은 (이전) 또는 후 (후) 확인 전에 후크를 구현할 수 있습니다. 이 경우, 배열이 유효 있는지 확인하기 위해 사후 검증을 사용할 수 있습니다. 그럼 그냥 있는지 확인 배열에는 중복이 없습니다. 당신이 당신의 세부 사항에 따라 만들 수 있습니다 효율성 향상이있을 수 있습니다. 당신은 단지 예를 들어 '_id'를하는 경우 당신은 단지 JS 기능이 포함되어 사용할 수 있습니다.

    catSchema.post('validate',function(next) {
        return new Promise((resolve,reject) => {
            for(var i = 0; i < this.kittens.length; i++) {
               let kitten = this.kittens[i];
               for(var p = 0; p < this.kittens.length; p++) {
                  if (p == i) {
                      continue;
                  }
                  if (kitten._id == this.kittens[p]._id) {
                      return reject('Duplicate Kitten Ids not allowed');
                  }
               }
            }
            return resolve();
        });
    });
    

    나는 그것이 오류를 지정하기 쉽기 때문 검증에 약속을 사용하는 것을 좋아합니다.

  5. from https://stackoverflow.com/questions/6743849/mongodb-unique-index-on-array-elements-property by cc-by-sa and MIT license