在Couchbase map/reduce视图中从reduce中排除键

在Couchbase map/reduce视图中从reduce中排除键,couchbase,nosql,Couchbase,Nosql,当某些条件不满足时(例如总和或计数为零),是否有办法不将结果包括在“减少”视图中 我的场景有点复杂,但为了简单起见,假设我们有航班预订作为文档提供。我还有航班时刻表,有空位在同一个位置。我的映射函数如下所示: function (doc, meta) { if (meta.id.match(/^flight./)) { emit([doc.flighno, doc.schedule], {"availableSeats", doc.availableSeats}); } el

当某些条件不满足时(例如总和或计数为零),是否有办法不将结果包括在“减少”视图中

我的场景有点复杂,但为了简单起见,假设我们有航班预订作为文档提供。我还有航班时刻表,有空位在同一个位置。我的映射函数如下所示:

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});
  }
}
"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}}
]
map函数随后将发出这些行(我对
schedule
使用这种人类可读的格式只是为了更容易阅读):

在我的情况下,我希望有一个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;
}
但是,本质上,我需要的是一个只包含键的视图,其中
availableSeats
requestedSeats
都是正数,即
toProcess
标志为真。我的大多数结果,其中一个值为零,因此,与它们无关,加载整个视图(始终会增长)并不理想

有什么建议吗

更新

我试着做:

if (result.tbd) {
  return(result);
}
else {
  return null;
}
而且

if (result.tbd) {
  return(result);
}
else {
  return {};
}
我不希望出现的键仍然出现,除了值是
null
{}
,如下所示:

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});
  }
}
"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}}
]


这与我一开始得到的没有太大区别,因为具有此类键的行数将增长很多。

您已经达到了一半。您只需检查
toProcess
标志,并返回一个空结果
{availablesets:0,waiting:0,toProcess:false}
,如果它是false而不是您计算的实际值。这样,您不想要的结果将不会传播到重新导出步骤,也不会被计数。

您所说的“空结果”是什么意思?我尝试了
return{}
返回null
但是运气不好,不需要的键仍然会出现。我还试图省略
return
子句,这看起来不太正确,但我还是尝试了,我认为它完全破坏了视图。我将很快更新我的问题,以反映我刚才描述的内容。谢谢。我刚刚更新了我的问题。这就是你所说的“返回空结果”吗?
"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}}
]