Индексировать и сортировать с новым полем - PullRequest
0 голосов
/ 11 октября 2019

У меня есть структура документа, как показано ниже:

{
  "_id": "6ed3d427045228dce9e3b38d111cb046",
  "_rev": "1-952bddae5572fbf2b0ce4a165c19c98b",
  "type": "USER",
  "name": "ABC",
  "email": "abc@gmail.com",
  "phone": "024578963"
}

Это приложение NodeJS, и я использую couchdb-nano. В целях сортировки (например, получение данных для разбивки на страницы) я создал индекс для вышеуказанных полей (name, email, phone).

Новое поле с именем created_date быловведенный в документы и все последние документы содержит created_date, как показано ниже:

{
  "_id": "6ed3d427045228dce9e3b38d111cb046",
  "_rev": "1-952bddae5572fbf2b0ce4a165c19c98b",
  "type": "USER",
  "name": "ABC",
  "email": "abc@gmail.com",
  "phone": "024578963",
  "created_date": 1570528394252
}

, так что все последние документы с определенного времени содержат created_date, а старые документы не имеют поля created_dateв документе.

Когда я пытаюсь сортировать, как показано ниже:

const q = {
      selector : {
        type: { "$eq": "USER" },
      },
      fields : ['name', 'email', 'phone', 'created_date'],
      limit: 100,
      skip: 10,
      sort : [{"created_date":"asc"}]
    };
await prodresdb.find(q);

Я не смогу получить старые документы, которые не состоят из created_date. Это связано с тем, что индекс created_date не будет индексировать старые документы, поскольку в них нет поля created_date.

Я уверен, что у кого-то еще есть эта проблема, и нужно выяснить ... Как преодолеть это? Есть ли способ CouchDB исправить это? Какова наилучшая практика для такого рода проблем.

1 Ответ

1 голос
/ 12 октября 2019

Я провел несколько тестов и обнаружил, что CouchDB просто не включает документы в результат _find , если они не содержат поле (атрибут), указанное в sort. На мой взгляд, это ошибка, поскольку sort неожиданно уменьшает отфильтрованный результат. Это особенно раздражает при использовании CouchDB вместе с PouchDB , потому что последний работает как ожидалось (также возвращает документы с отсутствующими атрибутами).

Добавление отсутствующего атрибута в существующие документы, как предлагается вкомментарий выше может решить вашу проблему. Однако во многих случаях (например, для числовых и логических атрибутов) это не является жизнеспособным решением, поскольку содержимое документа может быть сфальсифицировано.

Краткий ответ на ваш вопрос: во многих случаях нет прямого CouchDB способа исправить это.

ОБНОВЛЕНИЕ:

Интересно, что аналогичный продукт Couchbase Server решает эту проблему - для результатов полнотекстового поиска - с помощью детального контроля надпроцедура сортировки через поле missing.

отсутствует : указывает процедуру сортировки для документов с отсутствующим значением в поле, указанном для сортировки. Значение пропущенного может быть первым, в этом случае результаты с пропущенными значениями появляются раньше других результатов;или последний (по умолчанию), и в этом случае они появляются после.

...