【问题标题】:How to sort keys by length in PouchDB mapreduce?如何在 PouchDB mapreduce 中按长度对键进行排序?
【发布时间】:2020-01-11 01:04:00
【问题描述】:

我正在使用 React app 来搜索 IPFS 中托管的集合。

我正在使用 PouchDB 来存储路径和 IPFS id 之间的映射。我正在处理的界面是自动完成的。我数据库中的每个对象都类似于:

{
  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,
  }
)

我想按长度对键进行排序,以便首先完成部分完成。

我目前的理解是这是不可能的,我需要切换到将路径长度存储在对象中并为中间路径创建文档。然后我可以使用 sort 进行 Mango $gte 查询。

或者,我可以尝试 storing hierarchical data 中的一些方法,但我的路径元素不是全局唯一的,因此我必须分配节点 GUID 并从中构建路径。

【问题讨论】:

  • 您的搜索词是否包含路径分隔符?

标签: javascript mapreduce pouchdb


【解决方案1】:

我将节点添加到数据库中,用于根和叶之间的中间节点,并将每个路径的深度存储在文档中。 (最初的设计只有叶子路径。)

我还将序列化路径设为文档_id

现在我正在使用 Mango 查询进行补全搜索:

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

它有效,但需要几秒钟才能返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    相关资源
    最近更新 更多