【发布时间】:2011-05-17 17:32:53
【问题描述】:
我有一个存放一系列事件的 couchdb。每个事件都有一个所有者、一个 ID、它发生的时间和一条消息(加上一堆对本练习无关紧要的其他内容)。我想要一个按时间排序的最近发生的事件列表。我查看了这个问题CouchDB - filter latest log per logged instance from a list 并尝试使用它与reducer 中的比较翻转以保留第一条消息(使用我有一个复杂键的表单)。
不幸的是,它似乎并没有完全按照自己的意愿行事。
这是我的地图功能
function(doc) {
var owner, id;
if (doc.owner
&& doc.stream_id
&& doc.message
&& doc.receipt_time)
{
emit([doc.owner,doc.stream_id,doc.receipt_time],
{ owner: doc.owner,
stream_id: doc.stream_id,
timestamp: doc.receipt_time,
message: doc.message
});
}
}
还有我的reduce函数
function(keys, values) {
var challenger, winner = null;
for (var a = 0; a < values.length; a++) {
challenger = values[a];
if (! winner) {
winner = challenger;
} else {
if (winner.owner !== challenger.owner
&& winner.trace_id !== challenger.trace_id ) {
return null;
} else if (challenger.timestamp < winner.timestamp) {
winner = challenger;
}
}
}
return winner;
}
然后我调用 ?descending=true&group=true&group_level=2 从每个流中获取第一条消息,但是,它似乎不是按时间排序的,而是按所有者和 stream_id 排序的,就像这样
{"rows":[
{"key":["sam","a"],
"value":
{"owner":"sam","stream_id":"a","timestamp":1303754236482,"message":"foo"}
},
{"key":["sam","b"],
"value":
{"owner":"sam","stream_id":"b","timestamp":1303752578476,"message":"bar"}
},
{"key":["jim","j1"],
"value":
{"owner":"jim","stream_id":"j1","timestamp":1303625378839,"message":"stuff"}
},
{"key":["bob","loblaw"],
"value":
{"owner":"bob","stream_id":"loblaw","timestamp":1303328396532,"message":"more stuff"}
},
{"key":["anthony","foo"],
"value":
{"owner":"anthony","stream_id":"foo","timestamp":1303769699444,"message":"even more"}
}
]}
(注意最后的条目实际上是最新的)。
所以我希望最终视图是现在的样子,但按时间排序。有没有办法做到这一点?
【问题讨论】: