업데이트: 버전 3.4가 있습니다 사례 무감각 인덱스
이것은 알려진 문제입니다. MongoDB는 문자열에 대한 어휘 정렬을 지원하지 않습니다 (Jira : 문자열 사전 주문). 결과를 응용 프로그램 코드로 정렬하거나 숫자 필드를 사용하여 정렬해야합니다. 그래도 날짜 필드를 안정적으로 정렬해야합니다. 날짜별로 정렬이 작동하지 않는 예를 제시 할 수 있습니까?
문제
컬렉션을 문자열 필드를 정렬하려고 할 때 (여기 Title
), 정렬은 예상대로 작동하지 않습니다. 아래를 참조하십시오:
db.SomeCollection.find().limit(50).sort({ "Title" : -1 });
실제 결과 순서
예상 결과 순서
날짜 필드별로 정렬하려고 할 때 동일한 문제가 발생합니다.
제안이 있습니까?
해결책
업데이트: 버전 3.4가 있습니다 사례 무감각 인덱스
이것은 알려진 문제입니다. MongoDB는 문자열에 대한 어휘 정렬을 지원하지 않습니다 (Jira : 문자열 사전 주문). 결과를 응용 프로그램 코드로 정렬하거나 숫자 필드를 사용하여 정렬해야합니다. 그래도 날짜 필드를 안정적으로 정렬해야합니다. 날짜별로 정렬이 작동하지 않는 예를 제시 할 수 있습니까?
다른 팁
당신을 정확히 놀라게하는 것은 무엇입니까?
그것은 기호의 수치 표현의 표현을 기반으로 정렬됩니다. 당신이 보면 여기 (MongoDB는 UTF-8에 문자열을 저장한다는 것을 알고 있습니다. 그래서 이것은 단지 교육 목적을위한 것입니다). 대문자 문자는 해당 숫자가 소문자보다 낮다는 것을 알 수 있습니다. 따라서 그들은 앞에 갈 것입니다.
MongoDB는 현지화 또는 사례 둔감에 따라 문자를 정렬 할 수 없습니다.
당신의 경우 g
그때 더 높은 숫자가 있습니다 Z
, 먼저 (순서 감소로 정렬). 그리고 3
해당 숫자가 높습니다 2
그리고 1
. 기본적으로 모든 것이 정확합니다.
집계 예상 출력을 사용하는 경우 아래를 참조하십시오.
db.collection.aggregate([ { "$project": { "Title": 1, "output": { "$toLower": "$Title" } }}, { "$sort": { "output":-1 } }, {"$project": {"Title": 1, "_id":0}} ])
그것은 당신에게 줄 것입니다 예상 출력 아래:
{ "result" : [ { "Title" : "Zoe and Swift" }, { "Title" : "Zip at the Theme Park" }, { "Title" : "Zip at the Supermarket" }, { "Title" : "geog.3 students' book" }, { "Title" : "geog.2 students' book" }, { "Title" : "geog.1 students' book" } ], "ok" : 1 }
날짜가 올바르게 정렬되지 않는 것으로 시작합니다 ....
날짜를 a로 저장하는 경우 string
, 그것은 문자열로 정렬 할 수 있어야합니다. 아주 간단합니다.
2013-11-08 // yyyy-mm-dd (the dashes would be optional)
날짜 문자열의 모든 부분이 패딩되는 한 0
정확하게, 줄은 자연스럽게 그리고 당신이 기대하는 방식으로 모든 분류됩니다.
전체 날짜 시간은 일반적으로 UTC에 저장됩니다.
2013-11-23T10:46:01.914Z
그러나 나는 또한 날짜 값을 문자열로 저장하는 대신에 당신을 제안합니다. 기본 MongoDB 날짜를 사용하는 것이 더 합리적인지 여부를 고려합니다 (참조). MongoDB의 집계 프레임 워크를 보면 많은 것이 있습니다. 기능 이 날짜를 조작 할 수 있지만 문자열은 매우 제한적입니다.
문자열 정렬에 관해서는 컴퓨터가 사람으로 분류하는 방식이 아니라 데이터를 저장하는 것처럼 정렬된다는 것이 지적되었습니다. 문자열이 ASCII/UTF-8 표현으로 저장된다고 생각하면 분류가 왜 다음과 같은 방식으로 작동하는지 확인해야합니다.
Zoe = [90, 111, 101]
geo = [103, 101, 111]
지정한대로 내림차순으로 정렬하려면 어떻게 "geo"
의 내부 바이트 표현은 문자열보다 큽니다. "Zoe"
(와 함께 103
보다 높은 정렬 90
이 경우).
일반적으로 MongoDB를 사용할 때 권장 사항은 사례가 혼합 된 문자열을 정렬 해야하는 경우 문자열을 두 번 저장하는 것입니다.
"Title"
)"SortedTitle"
예를 들어, 코드는이를 사용하여 정렬하지만 실제 ""를 표시합니다.Title"
사용자에게. ROR 및 Mongomapper에서 수행하는 경우 다음 단계를 따르십시오.
모델 이름 ABC를 가져 와서 제목에 대한 결과를 가져 왔습니다.
@test_abc_details_array_full=Abc.collection.aggregate([
{"$project"=> {
"Title"=> 1,
"output"=> { "$toLower"=> "$Title" }
}},
{ "$sort"=> { "output"=>1 } },
{"$project"=> {Title: 1, _id:0}},
]);