Как отсортировать ключи по длине в PouchDB mapreduce? - PullRequest
0 голосов
/ 11 января 2020

Я работаю над приложением React для поиска по коллекциям, размещенным в IPFS.

Я использую PouchDB для хранения сопоставлений между путями и идентификаторами IPFS. Интерфейс, над которым я работаю, является автозаполнением. Каждый объект в моей базе данных выглядит примерно так:

{
  path: ['path', 'to', 'blob'],
  ipfs_id: 'Qem4u234jk34k…',
}

У меня есть проектный документ, который печатает все подпути, ведущие к записи:

const ddoc = {
  views: {
    all: {
      // emit confuses webpack in production
      map: (
        'function(doc) {'
        + 'for(i in doc.path) {'
        + 'var path = doc.path.slice(0,i+1).join("/");'
        + 'emit(path, null);'
        + '}'
        + '}'
      ),
      reduce: function(keys, values, rereduce) {
        return 1 // uniqueness
      }.toString(),
    },
  },
}

Мое автозаполнение выглядит так:

db.query(
  'paths/all',
  {
    startkey: search,
    endkey: `${search}\uFFFF`,
    limit: 25,
    group: true,
  }
)

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

В настоящее время я понимаю, что это невозможно, и мне нужно переключиться на сохранение длины пути в объекте. и создание документов для промежуточных путей. Тогда я мог бы выполнить запрос Man go $gte с sort.

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

1 Ответ

0 голосов
/ 11 января 2020

Я добавил узлы в базу данных для промежуточных узлов между root и листом и сохранил глубину каждого пути в документе. (в оригинальном дизайне только что были листовые пути.)

Я также сделал сериализованный путь документом _id.

Теперь я выполняю поиск завершения с помощью Man go query:

db.find({
  selector: {
    _id: {
      $gt: search,
      $lte: `${search}\uFFF0`,
    },
    depth: { $gt: null },
  },
  sort: ['depth'],
  limit: MAX_RESULTS,
})

Работает, но для возврата требуется несколько секунд.

...