我是沙发基地的新手,我试图了解视图中的过滤,排序和限制结果如何协同工作。
Couchbase版本:3.0.1
我使用nodejs作为SDK。
我有这样的地图功能
function (doc, meta) {
if (doc.type !== 'item' || !doc.category) {
return;
}
emit([doc.orderId, doc.category.id, doc.number], null);
}
一个看起来像这样的项目文件
{
"id": 1,
"type": "item",
"number": 1203,
"orderId": 2,
"category": {
"id": 10,
"title": "Carpet"
}
}
我想只过滤 orderId = 2 和 category.id = 10 的项目,所有这些都按数字降序排序。因为我有一个分页器,我想每页显示20个项目。我在数据库中有数千个项目。
通过下面的查询,我因为订单调用而出错。如果我发表评论,我会发现结果,过滤,限制并默认按编号升序排序。
var order_id = 2,
category_id = 10,
limit = 20,
skip = 0,
range = [order_id, category_id],
// suppose we have a valid couchbase connexion and a viewQuery object
query = viewQuery.from('items', 'myView')
.limit(limit)
.skip(skip)
.order(2) // 2 = DESC. This line doesn't work
.include_docs(true)
.range(range, range.concat([{}]), true);
bucket.query(query, function (err, docs) {
console.log(err);
console.log(docs);
});
错误说:
错误:query_parse_error:没有行可以匹配您的键范围,反转您的start_key和end_key或设置descending = false
请注意,如果我订购ASC ,则也会发生错误。我必须删除对.order()函数的调用才能使我的视图正常运行。
有谁知道为什么? 感谢
答案 0 :(得分:3)
当您按降序排序查询时,您还必须交换开始和结束键的顺序(参数为range
方法。)