如何通过使用db.search从cloudant返回大量记录?

时间:2018-10-04 20:48:38

标签: node.js cloudant

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

1 个答案:

答案 0 :(得分:0)

您不应通过解析传递文档。

注意getAllDocuments(queryOpqOptionstions... queryOpqOptionstions 听起来很奇怪

您最好使用Array.concat代替forEach...push

将所有文档初始化为成员变量

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