如何使用 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;
}
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;
}