2014-06-19 2 views
0

쿼리 결과에 개별 인덱스가 포함 된 경우 삽입 순서에 따라 순서가 유지되지 않습니다. mongo 쿼리에 복합 인덱스가 포함되어 있으면 결과 데이터 순서가 게재 신청서에 따라 유지 관리됩니까?Mongo 2.6 쿼리 결과 순서

+0

fmongbb가 계속 증가하는 키로 결과를 명시 적으로 정렬하지 않는 한 mongodb가 _any_ 조건 하에서 삽입 순서를 유지한다는 것을 보장합니다. –

+0

@JoachimIsaksson ObjectId는 단조롭기 때문에 항상 값이 증가합니다. 서버 및 애플리케이션 인스턴스의 시간 동기화 상황이 문제가 될 수 있으므로 문제를 해결할 수있는 데이터베이스 서버에이 할당을 위임하는 옵션이 항상 있습니다. –

+0

@NeilLunn 예,하지만 _id로 ObjectId를 사용하지 않는 많은 설치를 알고 있습니다. 또한, 나는 그 순서로 결과를 정렬하는 방법을 묻지는 않는다고 생각한다. (고유 인덱스가있는 경우조차도 잘 작동 할 것이기 때문에) 순서가 명시 적으로 정렬하지 않고 유지된다면 말이다. –

답변

1

선택한 색인은 쿼리에 사용 된 필드에 따라 달라지며 결과 순서는 색인 순서에 반영됩니다.

이 같은 데이터 그래서

:

{ "a": 5, "b:" 2 } 
{ "a": 5, "b": 1 } 
{ "a": 1, "b": 7 } 

그리고 복합 인덱스 :

db.collection.ensureIndex({ "a": 1, "b": 1 }) 

결과의 인덱스 필드를 주문합니다이 인덱스를 사용할 수있는 쿼리

{ "a": 1, "b": 7 } 
{ "a": 5, "b": 1 } 
{ "a": 5, "b:" 2 } 

삽입 주문을 유지하려면 0123의 $natural 수정자를 사용할 수 있습니다.:

db.collection.find({ a: { "$gte": 1 } }).sort({ "$natural": 1 }) 

이 문서가 디스크에서 발견하는 방법으로 주문하려면. 또는 당신은 단순히 그냥 "종류"

db.collection.find({ a: { "$gte": 1 } }).sort({ "_id": 1 }) 

이것은 _id 키에 의해 자신의 삽입 순서를 유지하기 위해 결과의 순서를 강제로 _id을 지정할 수 있으며 값을 증가합니다. 기본적으로 ObjectId 구현을 사용하는 경우에 해당해야합니다.

+2

내가 틀릴 수도 있지만 '$ natural'은 파일의 문서 위치를 정렬 기준으로 사용하지 않습니까? 문서 슬롯이 삭제 된 문서로 인해 재사용되는 경우 삽입 순서가 잘못 될 수 있습니다. –

+0

@JoachimIsaksson 공정한 점, 다른 경우는 순서가 유지되어야하므로'_id' 키를 ​​단순히 정렬하는 것입니다. 문서가 할당 된 공간을 초과하여 정기적으로 이동하는지 여부는 모두 문제입니다. 그러나 다시 그것은 당신이 정말로 피하려고 노력해야 만하는 것입니다. –

+0

감사합니다. 그러나 (_id) 또는 타임 스탬프에 대한 결과 데이터를 정렬하면 수백만 건의 레코드를 검색하려고 할 때 시스템에 부담이 추가됩니다. – Vipin

3

고유 인덱스가있는 지 여부는 중요하지 않습니다. 삽입 순서를 나타내는 인덱스로 정렬하지 않으면 MongoDB가 삽입 순서로 반환되지 않습니다 (고유 인덱스는 실제로는 특별하지 않습니다. 색인의 유형).

대신 자연 순서대로 반환됩니다 (디스크 순서의 한 종류이기 때문에 실제로는 $natural이 아닙니다).

이 자연 순서는 실제로 여기에서 설명한대로 내부 연결 목록에 지정된 순서입니다. Mongo 2.6 indexing - query result order과 @kwolfe는 실제로 정렬 된 결과를 얻는 방법을 설명했습니다.

1

컬렉션에 삽입 순서를 유지해야하는 경우 캡 된 컬렉션을 사용해야합니다. 캡 된 콜렉션의 경우 MongoDB는 자동으로 삽입 순서를 유지합니다. capped collection 문서에서

:

  • 출장 컬렉션은 삽입 순서의 보존을 보장합니다. 결과적으로 쿼리는 삽입 순서로 문서를 반환하는 인덱스가 필요하지 않습니다. 이 인덱싱 오버 헤드가 없으면 더 높은 삽입 처리량을 지원할 수 있습니다.

  • 캡 된 컬렉션은 삽입 순서가 디스크의 순서 (자연 순서)와 동일하며 문서 크기를 늘리는 업데이트를 금지 함을 보장합니다. Capped 콜렉션은 원본 문서 크기에 맞는 업데이트 만 허용하므로 문서가 디스크의 위치를 ​​변경하지 않습니다.

  • 캡 된 컬렉션은 스크립트 또는 명시 적 제거 작업을 수행하지 않고 컬렉션에서 가장 오래된 문서를 자동으로 제거합니다.

그러나 덮인 컬렉션은 몇 가지 큰 단점이있다 : 당신은 당신이 덮인 컬렉션에서 문서를 삭제할 수 없습니다
  • 컬렉션의 크기를 미리 정의해야한다

    • 을 (당신은 단지에서 모든 문서를 제거 할 수 있습니다 컬렉션)
    • 문서를 업데이트 할 수 있지만 업데이트로 인해 문서가 커지지 않을 수 있습니다.