CouchDB 查询更多动态值

CouchDB query for more dynamic values

我的 couchdb 中有更多 "Location documents" 经度和纬度字段。如何在数据库中找到所有与提供的经纬度的距离小于提供的距离的位置文档。

CouchDB 不是为动态查询构建的,因此没有 good/fast 在 vanilla couchDB 中实现它的方法。 如果您事先知道要计算与哪些位置的距离,则可以为每个位置创建一个视图并使用参数调用它 ?startkey=0&endkey=max_distance

function(doc) {
  function distance(...){ /* your function for calculating distance */ }
  var NY = {lat:40,lon:73}
  emit( distance(NY,doc), doc._id);
}

如果您事先不知道这些位置,您可以使用临时视图来解决它,但我强烈建议不要这样做,因为它很慢并且只能用于测试。

有一种方法可以使用 vanilla CouchDB 实现它,但这有点棘手。

您可以利用在一个请求期间可以应用两个地图函数这一事实。可以使用列表机制创建第二个映射函数。

列表在计算方面不是很有效,它们不能将结果缓存为视图。但它们有一个独特的功能——您可以将多个参数传递到列表中。此外,您的参数之一可以是例如 JS 代码,它在列表函数内部进行评估(有风险!)。

所以整个方案如下所示:

  • 创建执行粗略搜索的视图
  • 创建列表,接收自定义参数并优化数据集
  • 使客户端 API 以简化对该链的查询。

无法为您的具体情况提供确切的代码,许多细节不清楚,但似乎粗略搜索必须将结果分组到某种线性枚举方块中,并且列表执行更精确的计算。

请注意,该方案对于大型数据集可能效率低下,因为它的计算量很大。

Vanilla CouchDB 并不是真正为地理空间查询而构建的。

您最好的选择是使用 GeoCouch, CouchDB-Lucene 或类似的东西。

否则,您可以从地图函数中发出 Geohash,并对这些函数进行范围查询。

注意事项适用。围绕 Geohash "fault lines"(赤道、两极、经度 180 等)的查询可能会给出太多或太少的结果。

有多个 JavaScript 库可以帮助转换 to/from Geohash,并帮助解决其中一些警告。