2012-01-31 2 views
4

MongoDB에서 a field can have multiple values (값의 배열). 각각의 색인이 생성되므로 모든 값을 필터링 할 수 있습니다. 그러나 여러 값을 가진 필드를 "정렬"할 수 있고 그 결과는 무엇입니까?MongoDB 멀티 키는 어떻게 정렬합니까?

는 업데이트 : 불평등 길이 배열로

> db.test.find().sort({a:1}) 
{ "_id" : ObjectId("4f27e36b5eaa9ebfda3c1c53"), "a" : [ 0 ] } 
{ "_id" : ObjectId("4f27e3845eaa9ebfda3c1c54"), "a" : [ 0, 1 ] } 
{ "_id" : ObjectId("4f27df6e5eaa9ebfda3c1c4c"), "a" : [ 1, 1, 1 ] } 
{ "_id" : ObjectId("4f27df735eaa9ebfda3c1c4d"), "a" : [ 1, 1, 2 ] } 
{ "_id" : ObjectId("4f27df795eaa9ebfda3c1c4e"), "a" : [ 2, 1, 2 ] } 
{ "_id" : ObjectId("4f27df7f5eaa9ebfda3c1c4f"), "a" : [ 2, 2, 1 ] } 
{ "_id" : ObjectId("4f27df845eaa9ebfda3c1c50"), "a" : [ 2, 1 ] } 
{ "_id" : ObjectId("4f27e39a5eaa9ebfda3c1c55"), "a" : [ 2 ] } 

더 긴 배열이 짧은 배열

그래서보다 "낮은"입니다, 왜 [0] 전에 [0,1입니다 ] [2,1] 후에 [2]? 정렬은 첫 번째 배열 요소에서만 완료 되었습니까? 아니면 가장 낮은 것? 그 후에 그것은 삽입 명령입니까?

인덱스 스캔의 경우 (테이블 스캔과 대조적으로) 어떻게 구현됩니까?

답변

7

배열 요소 정렬은 매우 복잡합니다. 배열 요소는 배열 필드에서 별도로 인덱싱되므로 실제로 몇 가지 흥미로운 상황이 발생합니다. MongoDB는 정렬 방향에 따라 배열의 가장 낮은 값 또는 가장 높은 값을 기준으로 정렬합니다. 그 이상의 순서는 자연 스럽다. 즉

> db.test.save({a:[1]}) 
> db.test.save({a:[0,2]}) 
> db.test.find().sort({a:1}) 
{ "_id" : ObjectId("4f29026f5b6b8b5fa49df1c3"), "a" : [ 0, 2 ] } 
{ "_id" : ObjectId("4f2902695b6b8b5fa49df1c2"), "a" : [ 1 ] } 
> db.test.find().sort({a:-1}) 
{ "_id" : ObjectId("4f29026f5b6b8b5fa49df1c3"), "a" : [ 0, 2 ] } 
{ "_id" : ObjectId("4f2902695b6b8b5fa49df1c2"), "a" : [ 1 ] } 

:

는이 같은 일에 이어집니다. 반전 된 정렬 순서가 같습니다. 이것은 최상위 문서의 "a"필드가 가장 낮은 값과 가장 높은 값을 모두 가지고 있기 때문입니다.

MongoDB는 정렬에서 최상위 ({field : -1} 정렬) 또는 최하위 ({field : 1} 정렬)가 아닌 배열의 모든 값을 무시하고 나머지 값을 정렬합니다.

페인트에 (간략화 됨)가이 같은 일 사진 : 인덱스 B- 트리를 평평

을 {A : 1} 샘플 문서 위에 주어진 :

"a" value 0 -> document 4f29026f5b6b8b5fa49df1c3 
"a" value 1 -> document 4f2902695b6b8b5fa49df1c2 
"a" value 2 -> document 4f29026f5b6b8b5fa49df1c3 

당신은에서 스캔을 볼 수 있듯이 위에서 아래로 및 아래에서 위로 모두 동일한 순서가됩니다.

빈 배열은 가능한 가장 낮은 배열 값이므로 위의 쿼리의 위쪽과 아래쪽에 각각 나타납니다.

인덱스는 배열에서의 정렬 동작을 변경하지 않습니다.

+0

색인을 사용하는 경우에도 여전히 그렇습니까? – Thilo

+0

예, 인덱스가 쿼리 결과를 변경하지 않는 인스턴스 중 하나입니다. 안타깝게도, MongoDB에서 항상 그런 것은 아닙니다 (솔직하게 다소 버그를 생각합니다). –

+0

방금 ​​확인했습니다. 인덱스를 작성해도 정렬 순서가 변경되지는 않습니다 (물론 좋음). 어떻게 구현되는지 궁금합니다. – Thilo