如何使用Couchbase View编写简单查询?

时间:2014-07-25 01:04:13

标签: view couchbase

简单来说,我的意思相当于:

SELECT * FROM Orders WHERE Status =' Shipped';

该文件将如下:

{     "输入":"顺序",     " order_no":10002,     " order_date":" 2010-07-24",     " status":"发货",     " customer_no":1001 }

我可以用这样的地图制作视图:

function (doc, meta) {
    if(meta.type == "json" && doc.type == "order" && doc.status == "Shipped") {
        emit(meta.id, doc);
    }
}

但是我需要为我想查询的每个状态值提供不同的视图。我已经在Couchbase控制台中尝试了一些过滤器参数的各种排列,但还没有找到可行的组合。

1 个答案:

答案 0 :(得分:1)

我想出了这个,并认为我会分享我的解决方案。

人们使用View阅读了很多关于“创建索引”的内容,而这就是它不仅仅是一个SQL VIEW。因此,为了成功使用诸如startkey和endkey之类的View参数,我必须创建一个View,它会发出我想要查询的键。在这种情况下:

function (doc, meta) {
    if(meta.type == "json" && doc.type == "order") {
        emit(doc.status, doc);
    }
}

请注意,我不会将meta.id作为第一个arg发出到emit()。如果我这样做,我将不得不按身份查询,而不是按状态查询。无论如何,有了这个视图(我们可以称之为by_status),如果我想要发货订单,那么startkey和endkey参数都可以“发货”:

陈旧=假安培; startkey =%22Shipped%22安培; endkey =%22Shipped%22安培; connection_timeout = 60000&安培;限制= 10安培;跳过= 0

他们说返回整个doc(第二个emit()arg)并不是一个好主意。为了更经济,我想我可以返回一系列doc属性,如下所示:

function (doc, meta) {
    if(meta.type == "json" && doc.type == "order") {
        emit(doc.status, [meta.id, doc.customer_no, doc.order_no, doc.order_date]);
    }
}

仍提供所有属性,但不重复doc.type(硬过滤到“order”)和doc.status,这是结果的关键属性。顺便说一句,添加meta.id给了我一些我可以在get()调用中使用的东西。

希望这有助于某人。