我对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节点... 无论如何,有人需要进行此过滤工作,我相信在没有额外网络开销的情况下实际放置数据时更合适...
答案 0 :(得分:0)
Dimzon,
您可以使用descending
参数对视图发出的键的值进行排序。还有一个limit
参数会限制您为每个查询获得的响应数。
匿名, 安德鲁