Mapreduce couchdb map/reduce视图:仅计算最近的项目
我有以下文件。关键词的时间戳位置Mapreduce couchdb map/reduce视图:仅计算最近的项目,mapreduce,couchdb,Mapreduce,Couchdb,我有以下文件。关键词的时间戳位置 { _id: willem-aap-1234, keyword:aap, position: 10, profile: { name: willem }, created_at: 1234 }, { _id: willem-aap-2345, keyword:aap, profile: { name: willem }, created_at: 2345 }, { _id: oliver-aap-1235, keywo
{
_id: willem-aap-1234,
keyword:aap,
position: 10,
profile: { name: willem },
created_at: 1234
},
{
_id: willem-aap-2345,
keyword:aap,
profile: { name: willem },
created_at: 2345
},
{
_id: oliver-aap-1235,
keyword:aap,
profile: { name: oliver },
created_at: 1235
},
{
_id: oliver-aap-2346,
keyword:aap,
profile: { name: oliver },
created_at: 2346
}
可以通过以下方式查找每个profile.name的最新关键字:
map: function(doc) {
if(doc.profile)
emit(
[doc.profile.name, doc.keyword, doc.created_at],
{ keyword : doc.keyword, position : doc.position, created_at: doc.created_at }
);
}
reduce: function(keys, values, rered) {
var r = values[0];
for (var i=1; i<values.length; i++)
if (r.created_at < values[i].created_at)
r = values[i];
return r;
}
这为我提供了名为aname的概要文件的最新文档
但现在我想计算每个关键字的所有最新文档,并计算位置的总和。我不能让我的头围绕这个试图做它与地图/减少只
我的用户案例是:
function(head, req) {
var row;
var counts = {};
while (row = getRow()) {
var v = row.value;
var k = v.keyword;
if (v.position) {
if (!counts[k])
counts[k] = {
position : 0,
count : 0
}
counts[k].position += v.position;
counts[k].count++;
}
}
return JSON.stringify(counts);
}
有人能想出一个更好的方法来做到这一点,只使用map/reduce吗
谢谢有些部分的含义仍然有点模糊(例如,“位置”是什么?) 但从纯形式的角度来看,似乎您的列表在
关键字上创建了索引,而您的地图在[配置文件、关键字、时间戳]
上创建了索引
如果您确实需要不同的索引,那么您需要几个映射,每个索引一个。唯一的例外是,当您在[a,b,c]
上已经有了地图时,您可以更改“组级别”并获得另外两个索引:[a,b]
和[a]
详细信息并不特别重要。要点和你说的一模一样:我需要在配置文件、关键字、时间戳上建立索引,以首先获得每个配置文件、每个关键字的最新“位置”。然后,这个结果我需要在关键字上建立索引来计算和求和位置。在一个视图中有两种不同的排序--确定这是map/reduce无法完成的吗?不过,couchdb list函数似乎使我能够做到这一点。但是当配置文件的nr增加时,我会遇到迭代视图的所有结果的问题……问题是您在列表中创建的索引不会被存储。因此,性能将非常不理想。如果需要良好的性能,请为每个索引创建一个映射。如果您真的需要在同一个资源中混合这些索引,那么您应该在外部使用NodeJS。
function(head, req) {
var row;
var counts = {};
while (row = getRow()) {
var v = row.value;
var k = v.keyword;
if (v.position) {
if (!counts[k])
counts[k] = {
position : 0,
count : 0
}
counts[k].position += v.position;
counts[k].count++;
}
}
return JSON.stringify(counts);
}