Как вернуть большой набор записей из cloudant с помощью 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;
}

person John Glabb    schedule 04.10.2018    source источник


Ответы (1)


Вы не должны передавать документы через разрешение.

будьте осторожны getAllDocuments(queryOpqOptionstions... queryOpqOptionstions звучит странно

Лучше использовать 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;
}
person davidonet    schedule 09.10.2018