【问题标题】:Exclude key from reduce in Couchbase map/reduce views在 Couchbase 映射/减少视图中从减少中排除键
【发布时间】: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}}
]

但是,本质上,我需要的是一个只包含availableSeatsrequestedSeats 都是正数的键的视图,即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}}
]

这与我最初得到的并没有太大的不同,因为具有此类键的行数会增加很多。

【问题讨论】:

    标签: couchbase nosql


    【解决方案1】:

    你已经成功了一半。您只需要检查toProcess 标志并返回一个空结果{availableSeats: 0, waiting: 0, toProcess: false} 如果它为假而不是您计算的实际值。这样你不想要的结果就不会传播到 rereduce 步骤并且不会被计算在内。

    【讨论】:

    • “空结果”是什么意思?我试过return {};return null 但没有运气,不想要的键仍然出现。我还尝试省略 return 子句,这看起来不正确,但我还是尝试了,我认为它完全破坏了视图。我将很快更新我的问题以反映我刚才描述的内容。谢谢。
    • 我刚刚更新了我的问题。这就是“返回空结果”的意思吗?
    猜你喜欢
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多