Couchbase视图:按键获取文档,sorting

我使用的是couchbase 3.0.1社区版(build-1444)。 我有一个date和一系列标签的文件:

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

我创build了一个视图来通过标签匹配这些文档:

 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); } } 

当创build一个查询按键获取标签,一切都很好。 但现在,通过date_start后裔sorting的最好方法是什么?

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

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

如果我仍然想要sorting?

—–编辑—–

我正在使用限制来获取这些标签只有最后五个文件。 这就是要点:这个限制应该通过标签检索文档,但是需要按照datesorting。

谢谢

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

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

  2. 你可以做的另一件事 – 使用一个单一的查询 – 是发出标签和date,并(再次)在您的代码中sorting结果。

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

Couchbase查看结果将始终按键sorting,因此要实现查询,必须具有该键的date_start部分。

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

 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将是您需要在search结果(标题,标签…)中显示的文档数据的子集。

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

 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.sort().join("::") + "::" + current_time 。 (请注意,如果tags为空,则应按预期返回最近的文档。)

powerset很容易用python进行计算,在node.js中可能并不难,如果功率集的大小以2^n指数级增长,那么只需要在每个文档中强制执行最大数量的标记2^n