Сортировка с помощью $ или селектора с рабочим индексированием с использованием / db / _find - PullRequest
0 голосов
/ 24 января 2019

Справочная информация: у меня есть документы в базе данных. Все документы имеют поля type и asset_type. Я хочу получить все документы type asset и asset_type database. Некоторые из документов имеют поле «оценка» со значением, а некоторые из них не имеют поля. Я также хочу отсортировать по полю score в порядке убывания или в порядке возрастания.

Я включил $ или селектор, потому что для сортировки требуется наличие отсортированного поля как в селекторе, так и в индексе. Поскольку мне нужны все документы независимо от того, есть ли у них поле score или нет, я использовал этот хакерский метод.

Вот одна из моих многочисленных попыток:

let params = {
    'selector': {
        'type': 'asset',
        'asset_type': 'database',
        $or: [
            {'score': {'$exists': true}},
            {'score': {'$exists': false}}
        ]
    },
    'use_index': 'scoreSorted'
  };

if (descending) {
    params.sort = [{'score': 'desc'}];
} else {
    params.sort = [{'score': 'asc'}];
}

db.find(params, (err, body) => {
    doSomething(body);
});

Индекс:

{
  "index": {
    "fields": [
      "score"
    ]
  },
  "type": "json",
  "ddoc": "scoreSorted"
}

Образцы документов:

{
  "_id": "sample_doc1",
  "type": "asset",
  "asset_type": "database",
  "score": 62345
}, 
{
  "_id": "sample_doc2",
  "type": "asset",
  "asset_type": "database"
},
{
  "_id": "sample_doc3",
  "type": "asset",
  "asset_type": "database",
  "score": -2512
}

Это дает документы type asset и asset_type database, но они не сортируются по score, а сортируются по _id. Ответ также содержит предупреждение no matching index found, create an index to optimize query time.

Я тщательно просмотрел документацию, но не смог найти решение.

Может кто-нибудь указать мне решение, где сортировка работает, как я ожидаю?

...