我的沙发数据库中有一些文件,如下所示。每个cId都会改变。我创建了一个带map / reduce函数的视图来过滤掉几个文档并返回一个json文档列表。
文件结构 -
{
"_id": "ccf8a36e55913b7cf5b015d6c50009f7",
"_rev": "8-586130996ad60ccef54775c51599e73f",
"cId": 1,
"Status": true
}
以下是示例地图:
function(doc) {
if(doc.Key && doc.Value && doc.Status == true)
emit(null, doc);
}
以下是示例reduce:
function(key, values, rereduce){
var kv = [];
values.forEach(function(value){
if(value.cId != <some_val>){
kv.push({"k": value.cId, "v" : value});
}
});
return kv;
}
如果有两个文件并且减少输出包含1个文档的列表,这可以正常工作。但是如果我再添加一个文档(cId = 2),它会抛出错误 - “减少输出必须更快地收缩”。这是为什么造成的?我怎样才能实现我打算做的事情呢?
答案 0 :(得分:1)
错误的原因是,reduce函数实际上并没有减少任何东西(而是收集对象)。 documentation提到了这一点:
B树存储的工作方式意味着如果你实际上没有 减少reduce函数中的数据,最终得到CouchDB 复制大量数据,即使不是更快,也能线性增长 使用视图中的行数。
CouchDB将能够计算最终结果,但仅适用于视图 有几行。任何更大的东西都会经历一个非常缓慢的过程 查看构建时间。为了解决这个问题,CouchDB从版本0.10.0开始 如果您的reduce函数没有减少其输入,则抛出错误 值。
我不清楚你打算实现什么目标。 您想要根据特定条件检索文档列表吗?在这种情况下,没有reduce的视图就足够了。
编辑:如果所需结果取决于存储在某个文档中的值,则CouchDB具有名为 list 的功能。它是一个设计函数,如果传递include_docs = true,它可以访问给定视图的所有文档。
列表网址遵循以下模式:
/分贝/ _design /富/ _list /列表名称/视图名称
与视图类似,列表在设计文档中定义:
{
"_id" : "_design/foo",
"lists" : {
"bar" : "function(head, req) {
var row;
while (row = getRow()) {
if (row.doc._id === 'baz') // Do stuff based on a certain doc
}
}"
},
... // views and other design functions
}