【问题标题】:Couchbase View: get documents by keys, sortedCouchbase View:按键获取文档,排序
【发布时间】:2015-12-23 04:15:21
【问题描述】:

我使用的是 couchbase 3.0.1 社区版 (build-1444)。我有带有日期和标签数组的文档:

{
    // ...
    date_start: '2015-09-25',
    tags: ['tag1', 'tag2'],
    // ...
}

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

function (doc, meta) {
    // some tests to be sure the doc is alright
    // ...
    for (var i = 0, i < doc.tags.length; i += 1) {
        emit(doc.tags[i], null);
    }
}

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

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

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

如果我还想排序怎么办?

-- 编辑 -----

我使用限制仅获取带有这些标签的最后五个文档。这就是重点:这个限制应该按标签检索文档,但要按日期排序。

谢谢

【问题讨论】:

  • 您需要对tags 查询结果进行排序吗?或者只是按date_start排序的所有文档?
  • 仅所有文档(与tags 的查询匹配)按date_start 排序。
  • 题名不应该是按tags获取文档,排序吗?
  • 确实是标签,但是 couchbase 有这个方法 .keys() 可以让你搜索多个查询。这就是为什么我在标题中使用“键”

标签: node.js sorting couchbase


【解决方案1】:

我认为没有一种简单的方法可以得到你想要的,但你可以做到以下几点:

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

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

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

【讨论】:

  • 感谢您的意见!因为我现在的数据还不是很大,所以我选择了你的第二个提议。对我来说可能不是最好的优化,但它可以完成这项工作
【解决方案2】:

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 考虑到 power set 的大小呈指数增长 2^n .

【讨论】:

  • 谢谢!最后,我简化了流程。现在,检索所有文档并对它们进行 forEach 过滤和排序对我来说不是问题。对于我这 2 年或更长时间的情况来说,这应该足够了(这些数据增长得不那么快)。我会记住你的答案,以便在必要时提出一些建议
  • 当然这是一个合理的方法,如果您以后需要更高的性能,您也可以将排序结果的第一页写回Couchbase进行缓存。
猜你喜欢
  • 1970-01-01
  • 2016-06-13
  • 2013-04-04
  • 2012-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多