Javascript 如何在DB mapreduce中按长度对键进行排序?

Javascript 如何在DB mapreduce中按长度对键进行排序?,javascript,mapreduce,pouchdb,Javascript,Mapreduce,Pouchdb,我正在开发一个搜索IPFS中托管的集合的工具 我使用PockDB存储路径和IPFS ID之间的映射。我正在使用的界面是自动完成的。我的数据库中的每个对象都类似于: { path: ['path', 'to', 'blob'], ipfs_id: 'Qem4u234jk34k…', } 我有一个设计文档,它打印了通向条目的所有子路径: const ddoc = { views: { all: { // emit confuses webpack in produc

我正在开发一个搜索IPFS中托管的集合的工具

我使用PockDB存储路径和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,
  }
)
我想按长度对键进行排序,以便先完成部分

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


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

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

我还将序列化路径设置为文档
\u id

现在,我正在使用Mango查询进行完成搜索:

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

它可以工作,但需要几秒钟才能返回。

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