복붙노트

[MONGODB] MongoDB의 임베디드 문서에 고유 키

MONGODB

MongoDB의 임베디드 문서에 고유 키

가 포함 된 문서의 키에 대한 고유 키를 설정할 수 있습니까?

나는 다음과 같은 샘플 문서와 사용자 컬렉션이 있습니다 :

 {
       Name: "Bob",
       Items: [
           {
               Name: "Milk"
           },
           {
               Name: "Bread"
           }
       ]
    },
    {
       Name: "Jim"
    },

재산 Items.Name에 인덱스를 만들 수있는 방법이 있습니까?

내가 인덱스를 만들려고 할 때 나는 다음과 같은 오류가 발생했습니다 :

> db.Users.ensureIndex({"Items.Name": 1}, {unique:true});
E11000 duplicate key error index: GroceryGuruApp.Users.$Items.Name_1  dup key: {
 : null }

어떤 제안? 고맙습니다!

해결법

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

    1.고유 인덱스는 콜렉션에 걸쳐 존재한다. 당신이 클라이언트 코드에서 수행해야합니다 문서를 통해 고유성 및 기타 제약 조건을 적용합니다. (아마 가상 컬렉션은 당신이 그것을 위해 투표 할 수있다, 그것을 허용합니다.)

    고유 인덱스는 콜렉션에 걸쳐 존재한다. 당신이 클라이언트 코드에서 수행해야합니다 문서를 통해 고유성 및 기타 제약 조건을 적용합니다. (아마 가상 컬렉션은 당신이 그것을 위해 투표 할 수있다, 그것을 허용합니다.)

    당신이 당신의 사건에 일을하려고하는 것은 (이 배열 항목 안에 포함 된 문서를 참조하지 않음) 문서의 존재하지 않는 키 Items.Name 인덱스, 따라서 그것의 널 (null)을 생성하고 전역 고유 제한 조건을 위반 수집.

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

    2.당신은 당신이 희망하고 어떤 식으로 뭔가를 달성하기 위해 고유의 복합 스파 스 인덱스를 생성 할 수 있습니다. 최선의 선택 (클라이언트 측 여전히 더 좋을 수도)되지 않을 수도 있습니다,하지만 당신이 특정 요구 사항에 따라 요구하고 무엇을 할 수 있습니다.

    당신은 당신이 희망하고 어떤 식으로 뭔가를 달성하기 위해 고유의 복합 스파 스 인덱스를 생성 할 수 있습니다. 최선의 선택 (클라이언트 측 여전히 더 좋을 수도)되지 않을 수도 있습니다,하지만 당신이 특정 요구 사항에 따라 요구하고 무엇을 할 수 있습니다.

    이를 수행하려면 이름과 같은 레벨의 다른 필드를 만들어야합니다 : 밥 각각의 최상위 기록에 고유 (FIRSTNAME + 성 + 주소를 할 수있는, 우리는이 키 식별자를 부를 것이다).

    그렇다면이 같은 인덱스를 만들 :

    ensureIndex({'Identifier':1, 'Items.name':1},{'unique':1, 'sparse':1})
    

    즉 당신의 NULL 키 문제를 주위에 가야 있도록 스파 스 인덱스 필드가없는 항목을 무시합니다. 화합물 고유 인덱스로 고유 식별자 및 Items.name을 결합하면 사람 당 두 번 같은 항목 이름을 가질 수 있는지 확인해야합니다.

    나는 몇 달 나는 단지 몽고와 협력 한 것을 추가해야 내 과학은 해제 될 수 있지만. 이것은 경험적 증거보다는 관찰 된 동작을 기반으로하지 않습니다.

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

    3.인덱스는 모든 사용자에 걸쳐있을 것입니다 당신이 '독특한'을 위해 그것을 요구하기 때문에, 어떤 사용자는 같은 이름의 항목이있을 수 없습니다 및 두 개의 사용자가 같은 이름의 항목을 할 수 없습니다.

    인덱스는 모든 사용자에 걸쳐있을 것입니다 당신이 '독특한'을 위해 그것을 요구하기 때문에, 어떤 사용자는 같은 이름의 항목이있을 수 없습니다 및 두 개의 사용자가 같은 이름의 항목을 할 수 없습니다.

    너가 원하는게 그거야?

    또한, 다른 레코드 그런이, 짐이하는 분명,이 두 사용자 Items.Name의 '널 (null)'값을 갖는에 반대 있다고 나타 납니까?

    이 같은 인덱스 컬렉션 고유성 필요로 특이한 것이다.

    MongoDB의는 인덱스가 각 값의 첫 번째, 볼 경우 고유 인덱스를 허용하지 http://www.mongodb.org/display/DOCS/Indexes#Indexes-DuplicateValues,하지만 난 실제 솔루션이 경우 고유성 필요로하지 않는 것입니다 생각한다.

    당신은 단지 하나의 사용자에 대한 항목에서 고유성 확인하려면 당신은 $ addToSet 옵션을 시도 할 수 있습니다. http://www.mongodb.org/display/DOCS/Updating#Updating-%24addToSet 참조

  4. ==============================

    4.대안은 키와 항목 이름의 해시로 항목을 모델링하는 것입니다.

    대안은 키와 항목 이름의 해시로 항목을 모델링하는 것입니다.

    Items: { "Milk": 1, "Bread": 1 }
    

    난 당신이 제약 조건에 대한 성능 또는 순수 인덱스를 사용하려는 여부에 대해 확실하지 않다. 접근에 대한 권리 방법은 사용 사례에 따라, 그리고 원자 작업이 일관된 데이터를 유지하기에 충분 여부를 결정.

  5. ==============================

    5.당신은 순서 / 카운터 기능을 만드는 데 사용 findAndModify를 사용할 수 있습니다.

    당신은 순서 / 카운터 기능을 만드는 데 사용 findAndModify를 사용할 수 있습니다.

    function getNextSequence(name) {
       var ret = db.counters.findAndModify({
            query: { _id: name },
            update: { $inc: { seq: 1 } },
            new: true,
            upsert: true
        });
        return ret.seq;
    }
    

    새로운 ID가 필요할 때마다 그것을 사용 ...

    db.users.insert({
        _id: getNextSequence("userid"),
        name: "Sarah C."
    })
    

    이 http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/에서입니다. 확인 해봐.

  6. from https://stackoverflow.com/questions/4435637/mongodb-unique-key-in-embedded-document by cc-by-sa and MIT license