2013-12-11 9 views
0

문서는 3 개 배열 요소의 조합에 특이 인덱스가,mongoDB에 인덱스가있는 배열 요소를 삭제하는 방법은 무엇입니까?

{ 
"_id":"ffffff999999999f9ff9f9f9f", 
"Name" : "John Doe", 
    "Array" : [{ 
     "Id1" : "a8ed3d86b8464e0cae4672cef3862860", 
     "Id2" : "6d7aac14b1e142abafde167d928e3dbc", 
     "Id3" : "2323232" 
    }] 
} 

과 같다. 그래서 인덱스는

 "key" : { 
       "Array.Id1" : 1, 
       "Array.Id2" : 1, 
       "Array.Id3" : 1 
     }, 
     "unique" : true, 

, 이런 식으로 내 요구 사항을 찾습니다 : 나는 "_id"값을 기준으로 문서를 찾을 완전히 배열 요소를 제거하고 싶습니다.

문제 : 이런 식으로 뭔가를 시도하고 있었다 ,

db.Collection.update({"_id":"ffffffff52a8a15ce4b05d6a8d40f973"},{$unset:{Array:1}}) 

내가 배열 요소를 설정 해제하려고 할 때, 첫 번째 업데이트는 통과하지만, 연속 사람이 다음 오류와 함께 실패,

* E11000 중복 키 에러 인덱스 :. int.Collection $ Array.Id1_1_Array.Id2_1_Array.Id3_1 DUP 키 : {: 널 (null) : 널 (null) : 널 (null)} *

모든 작업이 있다면 나는 궁금 이 문제에 대해 주위에.

거대한 컬렉션에서 이것을 실행해야하고 색인을 수정하는 것은 옵션이 아닙니다.

어떤 제안이 도움이 될 것입니다.

감사합니다.

+0

색인을 수정하거나 제거해야합니다. – WiredPrairie

답변

0

이 최소 예에서 설명한 것처럼 처음부터 고유 인덱스 필드를 두 번 이상 설정 해제 할 수 없습니다. 나중에 설정을 해제하려고 할 때만 문제가 발생하지 않습니다.

> db.coll.ensureIndex({indexField:1}, {unique: true}) 
> db.coll.insert({name: "doc without index field 1"}) 
> db.coll.insert({name: "doc without index field 2"}) 
E11000 duplicate key error index: test.coll.$indexField_1 dup key: { : null } 

당신은 뭔가 다른 분야를 교체해야합니다 - 반드시 배열 만은 고유해야합니다 ...

+0

unset 값을 허용하는 다른 답변에서와 같이'sparse'를 사용할 수 있습니다. – WiredPrairie

+0

감사합니다. 나는 이것을 시도 할 것이다. – user1840125

1

고유 인덱스는 그런 식으로 작동합니다. 색인 된 필드에도 널 값 (null 값)을 중복해서 가질 수 없습니다 (또는 정의되지 않은 상태로 두십시오). 그러나 sparse 옵션을 사용하면이 작업을 수행 할 수 있습니다.

사용법 : 당신이 unset에 배열을하려고한다면, 당신은 스파 스 옵션을 색인을 다시 할 수 있습니다

db.collection.ensureIndex({ a: 1 }, { unique: true, sparse: true }).

Warning: Using these indexes will sometimes result in incomplete results 
when filtering or sorting results, because sparse indexes are not complete 
for all documents in a collection. 
+0

도움 주셔서 감사합니다. 재 인덱싱은 나를위한 옵션이 아니기 때문에 나는 업데이 트하는 동안 뭔가 다른 값 (일부 더미 고유 값)에 값을 설정하려고합니다. – user1840125

관련 문제