【问题标题】:CouchDB View with 2 Keys带有 2 个键的 CouchDB 视图
【发布时间】:2012-06-04 19:47:31
【问题描述】:

我正在寻找 couchdb 视图问题的通用解决方案。

例如,有这样的查看结果:

{"total_rows":4,"offset":0,"rows":[
{"id":"1","key":["imported","1"],"value":null},
{"id":"2","key":["imported","2"],"value":null},
{"id":"3","key":["imported","3"],"value":null},
{"id":"4","key":["mapped","4"],"value":null},
{"id":"5,"key":["mapped","5"],"value":null}
]

1) 如果我只想选择“导入”的文档,我会使用这个:

view?startkey=["imported"]&endkey=["imported",{}]

2) 如果我想选择所有 id 大于 2 的导入文档:

view?startkey=["imported",2]&endkey=["imported",{}]

3) 如果我想选择所有 id 介于 2 到 4 之间的导入文档:

view?startkey=["imported",2]&endkey=["imported",4]

我的问题是:如何选择 id 介于 2 和 4 之间的所有行?

【问题讨论】:

  • 有什么理由你不能有一个只发出第二个参数的单独视图?
  • 唯一的原因是,我有很多同样问题的案例,我想避免“复制”所有这些视图......我需要这个来实现滚动功能......

标签: map views couchdb mapreduce


【解决方案1】:

您可以尝试扩展上述解决方案,但在键前添加一种“发射索引”标志,如下所示:

map: function (doc) {
  emit ([0, doc.number, doc.category]); // direct order
  emit ([1, doc.category, doc.number]); // reverse order
}

这样你就可以用

view?startkey=[0, 2]&endkey=[0, 4, {}]

view?startkey=[1, 'imported', 2]&endkey=[1, 'imported', 4]

但无论如何,两种不同的观点会更好。

【讨论】:

  • 好的,我认为除了创建两个单独的视图之外没有其他解决方案
【解决方案2】:

不久前我遇到了同样的问题,所以我将解释我的解决方案。在任何 map 函数中,您都可以有多个 emit() 调用。您的地图函数可能如下所示:

function(doc) {
  emit([doc.number, doc.category], null);
  emit([doc.category, doc.number], null);
}

您还可以使用?include_docs=true 从您的任何查询中取回文档。那么您获取第 2 到第 4 行的查询将是

view?startkey=[2]&endkey=[4,{}]

您可以在CouchDB View Collation查看排序规则

【讨论】:

  • 感谢您的回答!但是这个解决方案比制作两个视图更糟糕,因为在这个解决方案中,您不知道结果行是 [number,category] ​​还是 [category,number] 元素。我的意思是你不知道,第一个关键元素是类别还是数字(例如,如果两者都是字符串)。
  • @leftjustified:键中的数字必须是字符串是否有原因?
  • number / category 只是一个例子,你也可以称它为 groupName 和 categoryName 或其他...或 city 和 category..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-31
  • 2013-05-21
相关资源
最近更新 更多