문제

컬렉션을 문자열 필드를 정렬하려고 할 때 (여기 Title), 정렬은 예상대로 작동하지 않습니다. 아래를 참조하십시오:

db.SomeCollection.find().limit(50).sort({ "Title" : -1 });

실제 결과 순서

  • "제목": "Geog.3 학생 책"
  • "제목": "Geog.2 학생 책"
  • "제목": "Geog.1 학생 책"
  • "제목": "Zoe and Swift"
  • "제목": "테마파크에서의 zip"
  • "제목": "슈퍼마켓에서의 지퍼"

예상 결과 순서

  • "제목": "Zoe and Swift"
  • "제목": "테마파크에서의 zip"
  • "제목": "슈퍼마켓에서의 지퍼"
  • "제목": "Geog.3 학생 책"
  • "제목": "Geog.2 학생 책"
  • "제목": "Geog.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를 사용할 때 권장 사항은 사례가 혼합 된 문자열을 정렬 해야하는 경우 문자열을 두 번 저장하는 것입니다.

  1. 원래 문자열 ("Title")
  2. 정규화 된 문자열로. 예를 들어 악센트가있는 캐릭터가있는 "소문자"와 같은 모든 것과 같은 모든 문자도 공통된 캐릭터로 변환 될 수 있습니다. 그래서 당신은 이름이 지정된 새로운 필드로 끝날 것입니다. "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}},

  ]); 
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top