2011-12-14 2 views

답변

27

짧은 대답 : 예.

인덱스가 컬렉션 드롭에 떨어지고 있습니다. 색인을 다시 만들어야합니다.

컬렉션을 삭제하지 않고 컬렉션에있는 모든 항목을 삭제하려면 db.collection_name.remove({})을 사용하는 것이 좋습니다. 더 많은 리소스가 필요하지만 색인을 남깁니다. 실제로 모든 색인 데이터를 삭제해야합니다. 그래서 전체 컬렉션을 삭제하고 그 후에 인덱스를 다시 만드는 것이 더 바람직합니다.

+1

빈 콜렉션에 색인을 생성 할 수 있습니까? – raffian

+1

가능합니다. 컬렉션을 만들 때 인덱스가 만들어집니다. –

+1

'remove()'는 큰 콜렉션에서 오랜 시간이 걸릴 수 있습니다. 'drop()'은 훨씬 빠르지 만 이미 언급했듯이 모든 인덱스를 제거하는 단점이 있습니다. – dcrosta

1

의심되는 것처럼 컬렉션을 삭제하면 모든 인덱스가 삭제되므로 컬렉션을 다시 만들 때 (명시 적으로 또는 새 문서를 추가하여 암시 적으로) 컬렉션을 다시 만들 때 필요한 인덱스를 다시 만들어야합니다. _id의 기본 색인이 자동으로 생성됩니다.

+1

인덱스가 이미 존재하는 경우 동일한 콜렉션에서 ensureIndex()를 여러 번 호출하는 것이 좋습니다. – raffian

+0

해를 끼치 지 마십시오. 경미한 성능 영향을 확인하려는 인덱스가 이미 있는지 확인하십시오. –

7

나는 10 개의 인덱스가있는 컬렉션에서이 작업을 수행했으며이를 수동으로 다시 만들고 싶지 않았습니다. 당신은 드롭을 수행하고, 몽고 쉘에서 다음과 같은 세 가지 라인으로 인덱스를 다시 만들 수 있습니다 :

var indexes = db.collection.getIndexKeys().splice(1) 
db.collection.drop(); 
indexes.forEach(function(el){ db.collection.ensureIndex(el, {background:true}); }) 

이 고유 또는 스파 스 인덱스를 처리 할 수있을만큼 똑똑하지 않지만 그 사용에 의해 지원하는 매우 쉽게 될 것이라고 생각 대신에 getIndexes()의 출력 나는 그것을 필요로하지 않았으므로 그것을하지 않았다.

splice (1)는 자동으로 생성되므로 _id의 색인을 제거하기위한 것입니다.

+0

많은 감사하지만,'{background : true}'는 제 인덱스를 지우고, 훌륭하게 작동하지 않습니다. –

관련 문제