2016-10-25 18 views
0

스키마를 변경할 때마다 고유 인덱스를 추가하거나 필드에 "sparse : true"를 설정 한 것처럼 변경 사항이 적용되도록 컬렉션을 삭제해야합니다. 프로덕션 서버에서는이 기능을 사용할 수 없습니다. 컬렉션을 삭제하지 않고 변경 사항을 적용 할 수있는 다른 방법이 있습니까? 나는 mongodb를 처음 사용합니다. mlab을 사용하고 있기 때문에 mongo 서비스를 다시 시작할 수 없습니다. 이걸 도와주세요.Mongodb는 컬렉션을 삭제하지 않고 모델 변경을 적용합니다.

참고 : nodejs 버전 4.2.0, mongoose 4.4.7, mongodb 3.2.9 (mlab 사용)를 사용하고 있습니다.

+2

고유 인덱스를 추가하거나 스파 스를 설정할 때 컬렉션을 삭제해야한다는 것은 무엇을 의미합니까? 그건 100 % 거짓입니다. – sergiuz

+1

이 색인을 적용하는 데 사용하는 코드를 제공 할 수 있습니까? 색인을 적용하려면 컬렉션을 삭제할 필요가 없습니다. – pieperu

+0

인덱스 필드가 새 문서에있는 경우 전체 컬렉션을 삭제해야한다고 생각하지 않습니다. 새롭고 오래된 문서를 공유 할 수 있습니까? – rushUp

답변

0

스키마를 변경할 때 컬렉션을 삭제하고 다시 만들 필요가 없습니다.

추가 정보 :

스파 스 인덱스는 인덱스 필드에 null 값이 포함 된 경우에도, 인덱스 필드가 문서에 대한 항목이 포함되어 있습니다. 인덱스는 인덱싱 된 필드가없는 모든 문서를 건너 뜁니다. 컬렉션의 모든 문서를 포함하지 않으므로 인덱스가 "드문 드문"입니다. 반대로 비 sparse 인덱스는 컬렉션의 모든 문서를 포함하며 인덱싱 된 필드가없는 문서의 경우 null 값을 저장합니다. 스파 스 인덱스가 쿼리에 대해 설정 완료되지 않은 결과를 초래하고 작업을 분류 할 경우 힌트()가 명시 적으로 인덱스를 지정하지 않는 한

스파 스 인덱스 및 불완전한 결과

는 MongoDB를 그 인덱스를 사용하지 않습니다.

스파 스 색인을 사용한다고해서 스파 스 색인 필드의 유무에 관계없이 레코드를 삽입 할 수는 없으므로 스키마 변경을 처리하기에 충분합니다.

는 아래의 수집을

Collection marks 
{_id:1, sub1: 67, sub2: 78, sub3: 56, total: 201} 
{_id:2, sub1: 60, sub2: 70, sub3: 50, total: 180} 
{_id:3, sub1: 80, sub2: 70, sub3: 50} 

Create sparse index 

db.marks.createIndex({ total: 1 } , { sparse: true, unique: true }) 


db.marks.find().sort({ total: -1 }) 
This query will return all the 3 records, we have applied sort on the sparse indexed field, but MongoDB will not select the sparse index to fulfill the query in order to return complete results. 

db.marks.find().sort({ total: -1 }).hint({ total: 1 }), this query will return only 2 records, those who are having the total, so to use the sparse index, explicitly specify the index with hint() 

참조

https://docs.mongodb.com/manual/core/index-sparse/

https://docs.mongodb.com/manual/core/index-sparse/#sparse-index-incomplete-results

희망은 도움을 참조하십시오!