CouchDB манго игнорирует порядок сортировки индекса - PullRequest
0 голосов
/ 25 апреля 2019

Я использую Hyperledger Fabric с CouchDB (версия 2.2.0, которая поставляется с образом докера hyperledger / fabric-couchdb).Существует ограничение на Fabric, которое не позволяет указывать массив сортировки для запросов манго, поэтому его следует выполнять с помощью индексов.

Проблема, с которой я сталкиваюсь, заключается в том, что независимо от того, задаю ли я сортировку «asc» или«desc» для полей индекса, результаты запроса всегда располагаются в одном и том же порядке.

Индекс, который я пытаюсь создать (также я бы предпочел использовать assetType в качестве частичного селектора индекса, но также не имел успеха):

{
    "index": {
      "fields": [
        {"assetType": "desc"},
        {"originalCustomer.document":"desc"}, 
        {"transactionDate":"desc"}
      ]
    },
    "ddoc": "date-index",
    "name": "date-index",
    "type": "json"
 }

Запрос, который я выполняю

{
    "selector": {
        "assetType": "receivable",
        "originalCustomer.document": "1",
        "transactionDate": {
            "$gt":"1900-01-01"
        }
    },
    "use_index": ["date-index"]
 }

_explain result

{
    "dbname": "testdb",
    "index": {
        "ddoc": "_design/date-index",
        "name": "date-index",
        "type": "json",
        "def": {
            "fields": [{"assetType": "asc"},{"originalCustomer.document":"asc"},{"transactionDate": "asc"}]
        }
    },
    "selector": {
        "$and": [
            {"assetType": {"$eq": "receivable"}},
            {"originalCustomer.document": {"$eq": "1"}},
            {"transactionDate": {"$gt": "1900-01-01"}}
        ]
    },
    "opts": {
        ...
    },
    "limit": 25,
    "skip": 0,
    "fields": "all_fields",
    "mrargs": {
        "include_docs": true,
        "view_type": "map",
        "reduce": false,
        "start_key": [
            "receivable",
            "1",
            "1900-01-01"
        ],
        "end_key": [
            "receivable",
            "1",
            "<MAX>"
        ],
        "direction": "fwd",
        "stable": false,
        "update": true,
        "conflicts": "undefined"
    }
}

один и тот же _find результат будет получен независимо от того, использую ли я "asc" или"desc" в индексе.Я ожидаю, что транзакция «Дата 2019-01-02» будет первой в списке, учитывая нисходящий порядок (для краткости я удалил несвязанные поля)

{
    "docs": [
        {
            "assetType": "receivable",
            "originalCustomer": {"document": "1"},
            "transactionDate": "2019-01-01"
        },
        {
            "assetType": "receivable",
            "originalCustomer": {"document": "1"},
            "transactionDate": "2019-01-01"
        },
        {
            "assetType": "receivable",
            "originalCustomer": {"document": "1"},
            "transactionDate": "2019-01-01"
        },
        {
            "assetType": "receivable",
            "originalCustomer": {"document": "1"},
            "transactionDate": "2019-01-02"
        },
        {
            "assetType": "receivable",
            "originalCustomer": {"document": "1"},
            "transactionDate": "2019-01-02"
        }
    ],
    "bookmark": "..."
}

1 Ответ

0 голосов
/ 13 июня 2019

При более внимательном рассмотрении справочника CouchDB API для / db / _index я вижу, что index object должен быть массивом имен полей JSON с синтаксисом sort ,Однако index object в примере запроса на той же странице ссылки не включает направление сортировки.В таких случаях применяется значение по умолчанию «asc».

Поскольку вы используете свой индекс для сортировки в обоих направлениях, указывать направление не нужно.Это выглядело бы следующим образом:

{
    "index": {
      "fields": ["assetType", "originalCustomer.document", "transactionDate" ]
    },
    ...
}

Требуемая сортировка отдельных результатов должна быть указана при запросе данных через / db / _find .Ваш запрос должен содержать объект сортировки, который соответствует синтаксису sort .Например, чтобы получить отсортированный по убыванию результат, запрос может выглядеть следующим образом.

{
    "selector": {
        "assetType": "receivable",
        "originalCustomer.document": "1",
        "transactionDate": {
            "$gt":"1900-01-01"
        }
    },
    "fields": ["assetType", "originalCustomer.document", "transactionDate" ],
    "sort": [
        {"assetType": "desc"},
        {"originalCustomer.document":"desc"}, 
        {"transactionDate":"desc"}
    ]
 }
...