2013-05-09 2 views
1

나는 pymongo를 사용하고 있으며 고유하고 희소성이있는 것으로부터 고유 색인을 업데이트하려고합니다. ensure_indexcreate_index 모두 이미 존재하는 색인을 업데이트하려는 것 같지 않습니다. 몽고를 실행하고 있습니다. 2.2.0pymongo에서 기존 색인 업데이트

In [1]: coll.index_information() 
Out[1]: 
{u'_id_': {u'key': [(u'_id', 1)], u'v': 1}, 
u'foo_1': {u'key': [(u'foo', 1)], u'unique': True, u'v': 1}} 

In [2]: coll.ensure_index([('foo', 1)], unique=True, sparse=True) 

In [3]: coll.index_information() 
Out[3]: 
{u'_id_': {u'key': [(u'_id', 1)], u'v': 1}, 
u'foo_1': {u'key': [(u'foo', 1)], u'unique': True, u'v': 1}} 

In [4]: coll.drop_index('foo_1') 

In [5]: coll.ensure_index([('foo', 1)], unique=True, sparse=True) 
Out[5]: u'foo_1' 

In [6]: coll.index_information() 
Out[6]: 
{u'_id_': {u'key': [(u'_id', 1)], u'v': 1}, 
u'foo_1': {u'key': [(u'foo', 1)], u'sparse': True, u'unique': True, u'v': 1}} 

아이디어가 있으십니까? 프로덕션 데이터베이스에서 수행 한 작업을 정확히 수행 할 수 없으며 인덱스를 삭제하고 다시 작성합니다.

+0

대안이없고 프로덕션 환경에서 복제본 또는 샤드를 실행중인 경우 http://docs.mongodb.org/manual/tutorial/build-indexes-on-replica-sets/를 사용하여 빌드를 고려할 수 있습니다. #procedure 따라서 보조 색인을 삭제하고 스파 스 사실을 사용하여 동일한 색인을 작성할 수 있습니다. 이 잘 작동합니다. –

답변

1

MongoDB는 일단 생성 된 색인 업데이트를 지원하지 않습니다. 필자는 어디서나 문서화 된 것을 찾을 수는 없지만 드라이버 중 누구도 기존 색인을 변경하는 기능을 가지고 있지 않습니다.

drop/create를 사용한 프로덕션 문제에 인덱스가없는 시간이있는 경우 기본 이름이 아닌 새 인덱스를 만들 수 있으며 일단 생성이 완료되면 기본 명명 된 번역.

인덱스 사용하여 보조 노드를 작성하기위한 전략이 인덱스를 만드는 동안 문제가 서버의 부하 인 경우 :

http://docs.mongodb.org/manual/tutorial/build-indexes-on-replica-sets/#procedure은 기본적으로 당신이 더 (복제 세트에서 멤버를 가져가 - -replSet 옵션, 다른 포트), 색인을 로컬로 빌드하고 다시 가져옵니다. 다음 멤버를 당겨서 인덱스를 로컬로 구축하고, 다시 추가하고, 린스하고, 반복합니다.

+0

좋은 아이디어. 실험에서 몽고처럼 보이는 것도 다른 이름이 있는지 상관하지 않습니다. 하지만 원본 인덱스를 내림차순으로 만 만든 다음 원래 인덱스를 삭제하고 sparse = true로 다시 만든 다음 임시 인덱스를 삭제하면 작동합니다. – danny