如何使用 db.search return 来自 cloudant 的大量记录?

How to return a large set of records from cloudant by using db.search?

db.find 工作正常但速度很慢。所以我尝试将 db.search 与搜索索引一起使用,但它限制为 200 条记录。因此,我通过使用内存不足的嵌套承诺调用相同的搜索来遍历所有书签。下面的代码有什么问题吗?

let qOptions;
qOptions = {'include_docs': true, limit: 200}
qOptions.q = "name: 'BEN'";

let allDocuments = [];
this.getAllDocuments(qOptions, allDocuments, 'app', 'myIndex')
.catch(err => {
  ....
})
.then((result) => {
  ....
});

然后是重复的承诺:

getAllDocuments(queryOpqOptionstions, allDocuments, designName, indexName) {
  const promise = new Promise((resolve, reject) => {
    dbConnection.search(designName, indexName, qOptions, (err, result) => {
      if (!err) {
        if (result.rows.length === 0) {
          resolve(allDocuments)
        } else {
          qOptions.bookmark = result.bookmark;
          result.rows.forEach((result) => {
            allDocuments.push(result)
          })

          this.getAllDocuments(qOptions, allDocuments, designName, indexName).then((docs) => {
            resolve(docs);
          }).catch((error) => {
            logger.error({err: error});
            reject(error);
          })
        }
      } else {
        logger.error({err: err});
        reject(err);
      }
    })
  })

  return promise;
}

你不应该通过 resolve 传递文档。

小心 getAllDocuments(queryOpqOptionstions... queryOpqOptions 听起来很奇怪

您最好使用 Array.concat 而不是 forEach...push

将allDocuments初始化为成员变量

this.allDocuments=[]
this.getAllDocuments(qOptions, 'app', 'myIndex')
.catch(err => {
  ....
})
.then((result) => {
  ....
});

...

getAllDocuments(qOptions, designName, indexName) {
  const promise = new Promise((resolve, reject) => {
    dbConnection.search(designName, indexName, qOptions, (err, result) => {
      if (!err) {
        if (result.rows.length === 0) {
          resolve()
        } else {
          qOptions.bookmark = result.bookmark;
          this.allDocuments = this.allDocuments.concat(result.rows)
          this.getAllDocuments(qOptions).then((docs) => {
            resolve();
          }).catch((error) => {
            logger.error({err: error});
            reject(error);
          })
        }
      } else {
        logger.error({err: err});
        reject(err);
      }
    })
  })

  return promise;
}