Couchbase附加过滤器

时间:2014-07-22 12:13:04

标签: couchbase

我对couchbase设计有这样的问题:查询视图会返回40000条记录。我需要在它们上面添加额外的过滤器,然后通过"获得前100个顺序。

我在我的应用程序代码中进行了这样的过滤/排序,这意味着我必须从Couchbase获取40000条记录(这非常耗时)。有没有办法在couchbase节点上执行过滤/排序(不将整个4000条记录提取到appserver)?

我的数据是旅游团,即

{
   "OT": "tour",
   "dd": 20140720,
   "city": 1206,
   "hotel": 9656,
   "stars": 2,
   "resort": 23415,
   "country": 34,
   "price": 24139,
   "priceType": 1,
   "tickets": "QQYY",
   "nights": 5,
   "food": 4,
   "oper": 18,
   "adult": 1,
   "ch": 0,
   "ch1": 0,
   "ch2": 0,
   "ch3": 0,
   "avail": 1,
   "stop": "Q"
}

我需要在4星或5星级酒店中选择从20140622到20140710之间从伦敦到土耳其的十大最便宜的旅行...

我的观点如下:

function (doc, meta) {
  if(meta.type==='json' && doc.OT==='tour'){
    emit(["A",doc.country,doc.city,doc.adult,doc.ch,doc.priceType,doc.dd,doc.price]);
    emit(["R" + doc.resort,doc.country,doc.city,doc.adult,doc.ch,doc.priceType,doc.dd,doc.price]);
  }
}

RESORT + COUNTRY + DEPARTURE_CITY + ADULT_COUNT + CHILD_COUNT + PRICE_TYPE + DEPARTURE_DATE允许我从3000000+(对于DEPARTURE_DATE范围)选择约40000条记录但有时(根据用户输入)我仍然需要按星星过滤它们(星星IN (4,5)例如)。另外,查看排序是" BY日期,价格"这是适用的,例如我得到了

20140101 110$ <- top but not cheapest
20140101 120$
20140102 100$ <- cheapest but not top
20140102 105$

另一方面,有时候我还需要获取N个最便宜的旅行,其中DepartureDate BETWEEN x和Y以及Price BETWEEN A和Z. 所有这些场景都需要额外的过滤器来过滤掉HUGE数据集(即使是上面显示的高选择性VIEW在我的情况下仍会产生巨大的数据集),我不希望将整个数据集提取到客户端(AppServer)进行这样的处理......我意识到在Couchbase节点上处理将消耗更多的CPU,但我更喜欢向群集添加更多Couchbase节点... 无论如何,有人需要进行此过滤工作,我相信在没有额外网络开销的情况下实际放置数据时更合适...

1 个答案:

答案 0 :(得分:0)

Dimzon,

您可以使用descending参数对视图发出的键的值进行排序。还有一个limit参数会限制您为每个查询获得的响应数。

匿名, 安德鲁