View 如何从couchdb视图返回最接近特定键的N个文档

View 如何从couchdb视图返回最接近特定键的N个文档,view,couchdb,limit,View,Couchdb,Limit,我有一个couchdb数据库的视图,该数据库将某个文档属性作为密钥公开: function (doc) { if (doc.docType && doc.docType === 'CARD') { if (doc.elo) { emit(doc.elo, doc._id); } else { emit(1000, doc._id); } } } 我感兴趣的是在这个数据库中查询25个文档,这些文档的键最接近给定的输入。我唯一

我有一个couchdb数据库的视图,该数据库将某个文档属性作为密钥公开:

function (doc) {
  if (doc.docType && doc.docType === 'CARD') {
    if (doc.elo) {
      emit(doc.elo, doc._id);
    } else {
      emit(1000, doc._id);
    }
  }
}
我感兴趣的是在这个数据库中查询25个文档,这些文档的键最接近给定的输入。我唯一能想到的是设置搜索范围并重复查询,直到得到足够的结果:

// pouchdb's query fcn
function getNresultsClosestToK(key: number, limit: number) {
  let range = 20;
  do {

      cards = await this.db.query('elo', {
        limit,
        startkey: (key - range).toString(),
        endkey: (key + range).toString()
      });

      range += 20;
    } while (cards.rows.length < limit)

    return cards;
}

但这可能需要几个电话,而且效率低下。有没有办法将一个键和一个限制传递给coach,让它返回最接近所提供键的限制文档?

如果我理解正确,您希望查询特定键,然后返回键前12个结果、键本身和键后12个结果,总共25个结果

最直接的方法是对视图进行两次查询,并正确组合startkey、limit和descending值

例如,要使用以下选项获取密钥本身和以下12个值:

开始键: 限额:13 降序:假 然后,要获取密钥前的12个条目,请使用以下选项执行查询:

开始键: 限额:13 下降:对 这将为您提供两个结果集,每个结果集最多包含13项。请注意,您的目标关键点将在每个结果集中重复。然后需要将两个结果集合并

注意:这确实有一些限制:

它最多返回26个结果。如果数据在目标键之前或之后不包含12个值,则得到的结果将少于26个。 如果有重复的键,可能会得到意外的结果。特别是:

如果您的目标密钥是重复的,您将得到25-N个唯一结果,其中N是目标密钥的重复数 如果非目标键是重复的,则无法保证将返回哪些重复键,因此多次执行相同的查询可能会导致不同的返回值。
这与我的意图不太相符,但它非常接近,非常有用。非常感谢。澄清一下:假设数据库中存在[1,2,3,4,5,6,7,8,67827]键,我要求得到最接近9键的3个极限结果。期望的回报是[6,7,8],而不是[7,867827]。幸运的是,在这种情况下,我可以依靠我的密钥近似正态分布,所以像这样的极端情况不太可能发生。