我在这里看到的(如果需要,我会改变我的答案)key1
和key2
看起来像独立的字段,所以你需要2个独立的视图。
我创建了我的测试数据库5个简单的文件:
// I've left out fields like _id and _rev for the sake of simplicity
{ "key1": "somevalue" }
{ "key1": "somevalue" }
{ "key2": "anotherval" }
{ "key2": "andanother" }
{ "key2": "andanother" }
这里有2次视图的查询您需要:
// view for key1
function(doc) {
if (doc.key1) {
emit("key1", doc.key1);
}
}
// view for key2
function(doc) {
if (doc.key2) {
emit("key2", doc.key2);
}
}
从那里,你减少函数可以返回所有的值通过这样做:
function (key, values) {
return values;
}
但是,您特别提到了不同值。由于JavaScript没有用于数组的原生unique()
方法,并且我们不能在视图函数中使用CommonJS模块,所以我们必须添加自己的逻辑。我只是复制了我在Google上发现的第一个array.unique()
函数,您可以自己编写一个更好的优化版本。
function (key, values, rereduce) {
var o = {}, i, l = values.length, r = [];
for (i = 0; i < l; i += 1) {
o[values[i]] = values[i];
}
for (i in o) {
r.push(o[i]);
}
return r;
}
您将在这两个视图中使用相同的reduce函数。当你查询任何这些视图时,默认情况下它也会执行reduce。 (你需要明确地传递reduce=false
让你map
功能的只是结果
这里有你检索使用上述map/reduce
查询结果集:(记得他们是2次独立的查询)
{"rows":[
{"key":"key1", "value": ["somevalue"]}
]}
{"rows":[
{"key": "key2", "value": ["anotherval", "andanother"]}
]}
您可以加入关于你的文档结构的更多细节? 'key1'和'key2'完全不同的字段?他们有某种相关性吗? – 2011-03-28 14:21:24
@Dominic - 我认为它的意思是{“key”:“key1”,“value”:“somevalue”}和{“key”:“key2”,“value”:“othervalue”}而不是key1和key2是不同的领域,但我同意它是模糊的。 – 2011-03-30 15:55:49
@Matt这或多或少是正确的,我们已经尝试了非常类似的解决方案,但不得不应对“reduce_overflow_error”问题。 – wayoutmind 2011-04-01 11:54:20