Nosql couchbase中的复合视图

Nosql couchbase中的复合视图,nosql,couchbase,couchbase-view,Nosql,Couchbase,Couchbase View,我是Couchbase的新手,我正努力让一个综合指数达到我想要的效果。用例如下所示: 我有一组“枚举”存储为文档 每个字段都有一个“last_updated”字段,您可能已经猜到了,该字段存储该字段上次更新的时间 我希望能够仅显示自某个给定日期以来已更新的枚举,但仍按枚举名称对列表进行排序 我创建了一个Couchbase视图,如下所示: function (doc, meta) { var time_array; if (doc.doc_type === "enum") {

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

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

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

startkey = ["a"]
endkey = ["Z"]
菲利佩·马纳纳(Filipe Manana)给出了一个完整的答案,解释了为什么不能按这些日期过滤

这里有一段引语:

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


因此,如果您想要一个按日期过滤的视图,那么日期数组应该在复合键中放在第一位。

不过,我不明白的是,如果我不引入字符串组件,而只是使用数组元素,即日期和时间的各个方面,我可以使用start/end_键过滤数组中的任何元素,它们似乎也用于排序目的。是的。Couchbase按键对结果进行排序,因此,如果您有复杂的键,如
[doc.a、doc.b、doc.c]
文档将首先按doc.a排序,然后具有相同doc.a的值将按doc.b排序,以此类推。如果
startkey:['a'、'b'、'c']
endkey:['z'、'x'、'c']
couchbase查找仅满足第一个条件的所有密钥,则使用相同的行为进行筛选。但是如果在开始/结束键中有相同的值,比如
['a','b']
['a','x']
couchbase将选择带有
doc.a='a'
doc.b='b'..'x'
的文档。
startkey = ["a"]
endkey = ["Z"]