Couchbase View:按键获取文档,排序

时间:2015-09-25 10:37:54

标签: node.js sorting couchbase

我正在使用couchbase 3.0.1社区版(build-1444)。我有包含日期​​和标签数组的文档:

$('#dropzoneForm').on('complete', function (file) {
    if ($('#dropzoneForm').getUploadingFiles().length === 0 && $('#dropzoneForm').getQueuedFiles().length === 0) {
        dropzoneFinished();
    }
});

我创建了一个视图,用标签匹配这些文档:

Dropzone.options.dropzoneForm.init = function () {
    this.on("complete", function () {
        if (this.getUploadingFiles().length === 0 && this.getQueuedFiles().length === 0) {
            dropzoneFinished();
        }
    });
}

创建查询以按键获取标签时,一切正常。但现在,通过date_start后代对此进行排序的最佳方法是什么?

我在文档(http://docs.couchbase.com/admin/admin/Views/views-querying.html)中看到:

  

使用此查询选项 [keys] 时,输出结果不按键排序。这是因为这些值的键排序需要在返回所请求的信息之前对所有行进行整理和排序。

如果我还想排序怎么办?

-----编辑-----

我正在使用限制来仅使用这些标记获取最后五个文档。这就是重点:这个限制应该按标签检索文件,但是订购日期。

由于

2 个答案:

答案 0 :(得分:0)

我不认为有一种简单的方式来获得你想要的东西,但你可以做到以下几点:

  1. 显然,您可以使用多个查询,然后将结果与代码相交。这并不像听起来那么糟糕:查询的准确性已经局限于“最终的一致性”,因此您的结果开始时并不准确。

  2. 您可以做的另一件事 - 使用单个查询 - 发出标签和日期,并(再次)对代码中的结果进行排序。

  3. 最后,也许这可以在NIQL中完成 - 但这只能在Couchbase 4中完成生产。

答案 1 :(得分:0)

Couchbase视图结果将始终按键排序,因此要获得查询,您必须拥有密钥的date_start部分。

要查询具有特定标记的文档,您可以使用如下地图函数:

function (doc, meta) {
    for (var i = 0; i < doc.tags.length; i += 1) {
        emit(doc.tags[i] + "::" + doc.date_start, docData);
    }
}

按键范围(tag + "::" + current_time, tag + "::" + the_beginning_of_time)查询视图。 docData将是您需要在搜索结果中显示的文档数据的子集(标题,标签,...)。

为了能够匹配多个标签上的文档,一个技巧就是发出所有可能的标签组合(即。the power set):

function (doc, meta) {
    var combinations = getSortedPowerSet(doc.tags)
    for (var i = 0; i < combinations.length; i += 1) {
        emit(combinations[i].join("::") + "::" + doc.date_start, docData);
    }
}

按键范围查询tags.sort().join("::") + "::" + current_time。 (请注意,当tags为空时,它应按预期返回最新文档。)

powerset是easy to compute in python,在node.js中可能不太难,你只需要为每个文件强制执行最大数量的标记n,因为它的大小是权力集在2^n呈指数增长。