[MONGODB] MongoDB의 임베디드 문서에 고유 키
MONGODBMongoDB의 임베디드 문서에 고유 키
가 포함 된 문서의 키에 대한 고유 키를 설정할 수 있습니까?
나는 다음과 같은 샘플 문서와 사용자 컬렉션이 있습니다 :
{
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.고유 인덱스는 콜렉션에 걸쳐 존재한다. 당신이 클라이언트 코드에서 수행해야합니다 문서를 통해 고유성 및 기타 제약 조건을 적용합니다. (아마 가상 컬렉션은 당신이 그것을 위해 투표 할 수있다, 그것을 허용합니다.)
고유 인덱스는 콜렉션에 걸쳐 존재한다. 당신이 클라이언트 코드에서 수행해야합니다 문서를 통해 고유성 및 기타 제약 조건을 적용합니다. (아마 가상 컬렉션은 당신이 그것을 위해 투표 할 수있다, 그것을 허용합니다.)
당신이 당신의 사건에 일을하려고하는 것은 (이 배열 항목 안에 포함 된 문서를 참조하지 않음) 문서의 존재하지 않는 키 Items.Name 인덱스, 따라서 그것의 널 (null)을 생성하고 전역 고유 제한 조건을 위반 수집.
-
==============================
2.당신은 당신이 희망하고 어떤 식으로 뭔가를 달성하기 위해 고유의 복합 스파 스 인덱스를 생성 할 수 있습니다. 최선의 선택 (클라이언트 측 여전히 더 좋을 수도)되지 않을 수도 있습니다,하지만 당신이 특정 요구 사항에 따라 요구하고 무엇을 할 수 있습니다.
당신은 당신이 희망하고 어떤 식으로 뭔가를 달성하기 위해 고유의 복합 스파 스 인덱스를 생성 할 수 있습니다. 최선의 선택 (클라이언트 측 여전히 더 좋을 수도)되지 않을 수도 있습니다,하지만 당신이 특정 요구 사항에 따라 요구하고 무엇을 할 수 있습니다.
이를 수행하려면 이름과 같은 레벨의 다른 필드를 만들어야합니다 : 밥 각각의 최상위 기록에 고유 (FIRSTNAME + 성 + 주소를 할 수있는, 우리는이 키 식별자를 부를 것이다).
그렇다면이 같은 인덱스를 만들 :
ensureIndex({'Identifier':1, 'Items.name':1},{'unique':1, 'sparse':1})
즉 당신의 NULL 키 문제를 주위에 가야 있도록 스파 스 인덱스 필드가없는 항목을 무시합니다. 화합물 고유 인덱스로 고유 식별자 및 Items.name을 결합하면 사람 당 두 번 같은 항목 이름을 가질 수 있는지 확인해야합니다.
나는 몇 달 나는 단지 몽고와 협력 한 것을 추가해야 내 과학은 해제 될 수 있지만. 이것은 경험적 증거보다는 관찰 된 동작을 기반으로하지 않습니다.
-
==============================
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.대안은 키와 항목 이름의 해시로 항목을 모델링하는 것입니다.
대안은 키와 항목 이름의 해시로 항목을 모델링하는 것입니다.
Items: { "Milk": 1, "Bread": 1 }
난 당신이 제약 조건에 대한 성능 또는 순수 인덱스를 사용하려는 여부에 대해 확실하지 않다. 접근에 대한 권리 방법은 사용 사례에 따라, 그리고 원자 작업이 일관된 데이터를 유지하기에 충분 여부를 결정.
-
==============================
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/에서입니다. 확인 해봐.
from https://stackoverflow.com/questions/4435637/mongodb-unique-key-in-embedded-document by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] findOneAndUpdate가 returnNewDocument과 함께 사용했을 때 true를 돌려줍니다 원본 문서 MongoDB를 (0) | 2019.12.14 |
---|---|
[MONGODB] 어떻게 배열에서 중복 된 항목을 제거하려면? (0) | 2019.12.14 |
[MONGODB] 대규모 분산 시스템에서 UUID 대 ObjectId가의 충돌 확률 (0) | 2019.12.14 |
[MONGODB] 중첩 된 문서 MongoDB의에서 합계 (0) | 2019.12.14 |
[MONGODB] 유성 방법 대 / 거부 규칙은 허용 (0) | 2019.12.14 |