【发布时间】:2016-03-10 19:56:42
【问题描述】:
当某些条件不满足时(例如,总和或计数为零),有没有办法在 reduce 视图中不包含结果?
我的场景有点复杂,但为了简单起见,假设我们有航班预订作为文件传入。我也有同一个桶中有可用座位的航班时刻表。我的地图功能看起来像这样:
function (doc, meta) {
if (meta.id.match(/^flight./)) {
emit([doc.flighno, doc.schedule], {"availableSeats", doc.availableSeats});
}
else if (meta.id.match(/^request\./) && doc.status = "pending") {
emit([doc.flighno, doc.schedule], {"requestedSeats", doc.requestedSeats});
}
}
然后,map 函数将发出这些行(我将这种人类可读的格式用于schedule,只是为了使其更易于阅读。):
"rows"=:[
{"id":"flight.123456", "key":["AC783","2016-05-04UTC"], "value":{"availableSeats":20}},
{"id":"request.1001", "key":["AC783","2016-05-04UTC"], "value":{"requestedSeats":2} },
{"id":"request.1002", "key":["AC783","2016-05-04UTC"], "value":{"requestedSeats":3} },
{"id":"request.1003", "key":["AC783","2016-05-04UTC"], "value":{"requestedSeats":5} },
{"id":"flight.654321", "key":["AC783","2016-05-11UTC"], "value":{"availableSeats":50}},
{"id":"request.2001", "key":["AC783","2016-05-11UTC"], "value":{"requestedSeats":5} },
{"id":"request.2002", "key":["AC783","2016-05-11UTC"], "value":{"requestedSeats":25}},
{"id":"request.2003", "key":["AC783","2016-05-11UTC"], "value":{"requestedSeats":35}},
{"id":"flight.999999", "key":["AC123","2016-05-13UTC"], "value":{"availableSeats":0} },
{"id":"request.3001", "key":["AC123","2016-05-13UTC"], "value":{"requestedSeats":5} },
{"id":"request.3002", "key":["AC123","2016-05-13UTC"], "value":{"requestedSeats":15}},
{"id":"request.3003", "key":["AC123","2016-05-13UTC"], "value":{"requestedSeats":35}},
{"id":"flight.888888", "key":["AC124","2016-05-13UTC"], "value":{"availableSeats":45}},
{"id":"flight.777777", "key":["AC125","2016-05-13UTC"], "value":{"availableSeats":40}},
{"id":"request.4001", "key":["AC125","2016-05-13UTC"], "value":{"requestedSeats":10}},
{"id":"request.4002", "key":["AC125","2016-05-13UTC"], "value":{"requestedSeats":10}},
{"id":"request.4003", "key":["AC125","2016-05-13UTC"], "value":{"requestedSeats":20}}
]
在我的例子中,我想要一个 reduce 函数,将航班文件与请求文件中可用座位的总和聚合在一起。我能做到的事情是这样的:
function(key, values, rereduce) {
var result = {availableSeats: 0, waiting: 0, toProcess: false};
for(var i=0; i < values.length; i++) {
if (values[i].availableSeats > 0) {
result.availableSeats += values[i].availableSeats;
}
if (values[i].requestedSeats > 0) {
result.requestedSeats += values[i].requestedSeats;
}
}
result.toProcess = Math.min(result.availableSeats, result.requestedSeats) > 0;
return result;
}
缩小视图的结果是:
"rows"=:[
{"key":["AC783","2016-05-04UTC"], "value":{"availableSeats":20, "requestedSeats": 10, "toProcess": true}},
{"key":["AC783","2016-05-11UTC"], "value":{"availableSeats":50, "requestedSeats": 60, "toProcess": true}},
{"key":["AC123","2016-05-13UTC"], "value":{"availableSeats":0, "requestedSeats": 55, "toProcess": false}},
{"key":["AC124","2016-05-13UTC"], "value":{"availableSeats":45, "requestedSeats": 0, "toProcess": false}},
{"key":["AC125","2016-05-13UTC"], "value":{"availableSeats":40, "requestedSeats": 40, "toProcess": true}}
]
但是,本质上,我需要的是一个只包含availableSeats 和requestedSeats 都是正数的键的视图,即toProcess 标志为真。我的大多数结果,其中一个值为零,因此,与它们无关,加载整个视图(将始终增长)并不理想。
有什么建议吗?
更新:
我尝试过:
if (result.tbd) {
return(result);
}
else {
return null;
}
还有
if (result.tbd) {
return(result);
}
else {
return {};
}
除了值是null 或{},我不希望仍然显示的键,如下所示:
"rows"=:[
{"key":["AC783","2016-05-04UTC"], "value":{"availableSeats":20, "requestedSeats": 10, "toProcess": true}},
{"key":["AC783","2016-05-11UTC"], "value":{"availableSeats":50, "requestedSeats": 60, "toProcess": true}},
{"key":["AC123","2016-05-13UTC"], "value":null},
{"key":["AC124","2016-05-13UTC"], "value":null},
{"key":["AC125","2016-05-13UTC"], "value":{"availableSeats":40, "requestedSeats": 40, "toProcess": true}}
]
或
"rows"=:[
{"key":["AC783","2016-05-04UTC"], "value":{"availableSeats":20, "requestedSeats": 10, "toProcess": true}},
{"key":["AC783","2016-05-11UTC"], "value":{"availableSeats":50, "requestedSeats": 60, "toProcess": true}},
{"key":["AC123","2016-05-13UTC"], "value":{}},
{"key":["AC124","2016-05-13UTC"], "value":{}},
{"key":["AC125","2016-05-13UTC"], "value":{"availableSeats":40, "requestedSeats": 40, "toProcess": true}}
]
这与我最初得到的并没有太大的不同,因为具有此类键的行数会增加很多。
【问题讨论】: