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

问题描述 投票:0回答:1

我在沙发数据库中有一个视图,该视图将某个文档属性公开为键:

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;
}

但是这可能需要打几个电话,效率很低。有没有一种方法可以将单个密钥和限制传递到沙发上,并使其返回最接近所提供密钥的limit文档?

view couchdb limit
1个回答
0
投票

如果我理解正确,您想查询一个特定的键,然后在键之前返回12个结果,键本身,在键之后返回12个结果,总共25个结果。

最直接的方法是对视图进行两次查询,并正确组合startkeylimitdescending值。

例如,要获取密钥本身及其后的12个值,请使用以下选项选择query your view

  • 开始键:
  • 限制:13
  • 降序:false

然后获得键之前的12个条目,使用以下选项执行查询:

  • 开始键:
  • 限制:13
  • 降序:true

这将为您提供两个结果集,每个结果集(最多)有13个项目。请注意,您的目标键将重复(在每个结果集中)。然后,您需要组合两个结果集。

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

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

    • 如果目标密钥重复,您将获得25-N个唯一结果(其中N是目标密钥重复的数目)
    • 如果您的非目标键是重复的,则无法保证将返回哪个重复的键,因此多次执行相同的查询可能会导致返回值不同。
© www.soinside.com 2019 - 2024. All rights reserved.