在couchbase中的复合视图

时间:2013-06-12 22:11:27

标签: nosql couchbase couchbase-view

我是Couchbase的新手,我正在努力获得一个综合指数来做我想做的事情。用例是这样的:

  • 我有一组“枚举”存储为文档
  • 每个都有一个“last_updated”字段 - 正如您可能已经猜到的那样 - 存储字段上次更新的时间
  • 我希望能够仅显示自某个给定日期以来已更新的枚举但仍按列举名称对列表进行排序

我创建了一个像这样的Couchbase视图:

function (doc, meta) {
   var time_array;
   if (doc.doc_type === "enum") {
      if (doc.last_updated) {
         time_array = doc.last_updated.split(/[- :]/);
      } else {
         time_array = [0,0,0,0,0,0];
   }
   for(var i=0; i<time_array.length; i++) { time_array[i] = parseInt(time_array[i], 10); }
   time_array.unshift(meta.id);
   emit(time_array, null);
}

}

我有一条记录没有设置last_updated字段,因此它的时间字段都设置为零。我认为作为第一个测试,我可以过滤掉这个结果,然后我将进行以下操作:

startkey = ["a",2012,0,0,0,0,0]
endkey = ["Z",2014,0,0,0,0,0]

虽然列表按'id'排序,但它不会过滤任何内容!谁能告诉我我做错了什么?是否有更好的复合视图来实现这些结果?

1 个答案:

答案 0 :(得分:1)

在使用startkey - endkey查询视图时,在couchbase中,您无法按2个或更多属性过滤结果。 Couchbase只有一个索引,因此它只会通过第一个参数过滤您的结果。因此,您的查询将与查询相同:

startkey = ["a"]
endkey = ["Z"]

这是一个link来完成Filipe Manana的答案,为什么不能按这些日期过滤。

以下是它的引用:

  

对于复合键(数组),元素从左到右进行比较,一旦元素与另一个键中的对应元素不同,比较就会完成(与比较字符串àrapcmp()或strcmp时会发生的情况相同) ())。

因此,如果您想要一个按日期过滤的视图,则日期数组应该在复合键中首先显示。