一次调用可以从CouchDB检索到多少文档



CouchDB数据库中存储了500000个文档。客户端应用程序需要检索所有文档以便处理到另一个系统中。是否有一种推荐的检索所有内容的方法?我知道存在使用";极限;以及";跳过";参数。看起来可以调用以获取总文档,然后使用循环来调用CouchDB动态更新";极限;以及";跳过";价值观有没有其他方法可以检索所有内容?

除了复制,我认为不是。当然,这实际上取决于OP中没有给出的细节。500k个200b的文档可能不是带宽问题,但500k个100kb的文档可能是一个考虑因素。

有很多方法可以解决这个问题,由于有很多细节没有给出,所以大多数人所能做的就是提供一种通用的方法,我将在这里这样做。

其本质是将/{db}/\all_docs与start_keylimitskip组合使用。

初始状态应为

  • start_key = null因为null是CouchDB视图排序规则中的第一个
  • limit = ?任意,因为它取决于平均文档大小、带宽、处理能力等
  • skip = 0一开始什么都不想跳过

一般的解决方案是根据最后的响应调整start_keylimit

请注意,skip的效率可能非常低。在这个解决方案中,skip是0或1,这是完全可以的

每个连续状态取决于先前的响应:

  • start_key = last rows doc key不知道下一个密钥是什么,对吧
  • skip = 1所以响应不包括最后一个响应文档

换句话说,随后的请求是说";给我下一组文档,从收到的最后一个文档密钥开始"。

这是一个基于纳米的脚本,它提供了一个可以扔肉的骨架。它很天真,因为它建议使用URL凭据,并且为了清晰起见没有错误处理。

const nano = require("nano")("http://{uid:pwd@address:port");
const db = nano.db.use("{your db name}");
const echo = (json) => console.log(JSON.stringify(json, undefined, 2));
const processRows = (rows) => {  
echo(rows);
};
(async () => {
let start_key = null;
let limit = 2; // whatever
let skip = 0;
let response;
let more = false;

do {
if (response) {
// next query is based on the last query.
start_key = response.rows.pop().key;
skip = 1;
}
response = await db.list({ start_key, limit, skip });
processRows(response.rows);
more = response.rows.length === limit;
} while (more);
console.info("Procesing completed.");
})();

最后,这也会返回_design_docs——可能是想过滤掉这些。

更新
我忽略了添加实际答案:默认情况下,返回所有行,如CouchDB文档第1.5.4.4节所述。使用限制和跳过行,所以这取决于调用者。

最新更新