【问题标题】:How exactly is startkey and endkey working in CouchDB?startkey 和 endkey 在 CouchDB 中究竟是如何工作的?
【发布时间】:2013-06-17 13:18:32
【问题描述】:

我正在使用 CouchDB 中的位置数据库。我创建了一个视图,其中我的键是一个具有四舍五入的纬度和经度值的数组。现在我选择以下条件:

Startkey: [ 52.34, 4.883 ]
Endkey:   [ 52.37, 4.903 ]

我希望我只会收到纬度在 52.34 和 52.37 之间的文档。以及4.883和4.903之间的经度。

我收到的结果:

[ 52.358, 4.919 ]
[ 52.358, 4.919 ]
[ 52.362, 4.861 ]
[ 52.362, 4.861 ]
[ 52.362, 4.861 ]

您可能已经注意到,第一个结果中的经度大于结束键 4.919 的经度。

现在我知道/读到某处我会收到一些超出数组第二项范围的值。但是第一项怎么可能已经不符合条件了呢?

我用谷歌搜索了一下,我真的找不到关于 startkey/endkey 作为数组的解释。谁能给我解释一下 CouchDB 如何遍历文档并定义何时“开始”和何时“结束”?

【问题讨论】:

  • 我知道不支持二维查询(因此您的查询将不起作用)。许多人使用 GeoCouch (github.com/couchbase/geocouch)。
  • 你是说Couch会忽略数组中的第二个元素?
  • 不支持二维查询,所以我想您可能会认为“忽略”。

标签: couchdb


【解决方案1】:

使用这些键在您的视图中假设以下数据:

startkey == [a, 11]endkey == [c, 11]

[a, 10]
[a, 11]   <-- startkey
[a, 12]   <--
[b, 10]   <--
[b, 11]   <--
[b, 12]   <--
[c, 10]   <--
[c, 11]   <-- endkey
[c, 12]

(将返回所有标有箭头的内容)。

视图中的数据使用键进行排序。使用startkeyendkey,您可以控制视图中开始结束的位置。您不能为数据指定约束。将返回在startkeyendkey 之间排序的所有内容。请阅读http://wiki.apache.org/couchdb/View_collation了解更多信息。

如果您想进行地理空间查询,您应该查看 GeoCouch (https://github.com/couchbase/geocouch/)。


总结:CouchDB 视图中的键存储在一维列表中。这些列表中的条目根据View_collation 中的规则进行排序。二维数组可能看起来很特别,但实际上并非如此。 [a, 10] 排序 after [a] and after a and before [b, 5] and before @ 987654335@(例如)。

如果您使用startkeyendkey,您会说“包括startkey 和之后以及endkey 之前和包括之前和包括endkey 在内的所有内容”。 startkeyendkey 条目不必出现在列表中。

【讨论】:

  • 如果我们从上面的示例中删除 [a, 10] 和 [a, 11]。那么 Couch 会从 [a, 12] 开始吗?我的情况似乎就是这样。
  • 是的,这确实会发生。 CouchDB 获取下一个等于或大于 startkey 的键。
  • 尽管它也比 endkey 大。好的,令人困惑,但感谢您的澄清:-)
  • 如果您将数据视为坐标,这会令人困惑,是的。但它们不是 ;-) 它们只在一维中排序,然后很容易看出 [b,12] 实际上小于 [c,11]。
  • 啊,所以一开始 Couch 只寻找第一个键。只有当第一个键确实大于 startkey 并且小于 endkey Couch 开始寻找第二个键时,如果那个也大于 startkey 并且小于 endkey,它就是一个“匹配”。对吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-09
  • 1970-01-01
  • 2023-04-01
相关资源
最近更新 更多