【问题标题】:Composite views in couchbasecouchbase 中的复合视图
【发布时间】:2013-06-09 04:49:30
【问题描述】:

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

【问题讨论】:

    标签: nosql couchbase couchbase-view


    【解决方案1】:

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

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

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

    这里引用一段话:

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

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

    【讨论】:

    • 不过,我不明白的是,如果我不引入字符串组件,而只使用作为日期和时间各个方面的数组元素,我可以过滤使用 start/end_key 到数组的任何元素,看起来它们也被用于排序目的。
    • 是的。 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' 的文档。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多