0

我是 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”排序,但它没有过滤任何内容!谁能告诉我我做错了什么?是否有更好的复合视图来实现这些结果?

4

1 回答 1

1

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

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

这是 Filipe Manana 的完整答案的链接,为什么不能按这些日期过滤。

这是它的引述:

对于复合键(数组),从左到右比较元素,一旦元素与另一个键中的对应元素不同,比较就结束(与比较字符串 à la memcmp() 或 strcmp() 时发生的情况相同) .

所以如果你想要一个按日期过滤的视图,日期数组应该放在复合键的第一位。

于 2013-06-13T06:28:30.363 回答