【问题标题】:Cloudant couchdb changes api and geospatial indexesCloudant couchdb 更改 api 和地理空间索引
【发布时间】:2016-09-30 19:13:09
【问题描述】:

目前我正在通过监视以下资源进行过滤复制:

_changes?filter=_selector&include_docs=true&attachments=true&limit=20

如您所见,我使用的是由

定义的选择器
"selector": {
  "type": "Property"
}

一切都很好。现在我需要添加另一个标准,即地理空间索引。我想复制具有半径位置的文档。例如 纬度=-11.05987446&lon=12.28339928&radius=100 如何使用上述过滤复制技术进行复制并在半径范围内复制文档? 谢谢

【问题讨论】:

  • 如果你继续使用 cloudant,你有一些地理空间索引的查询选项。根据需要更改它们,然后单击右上角的 API 以获取 URL 设置。

标签: couchdb cloudant


【解决方案1】:

_changesselector 过滤器没有索引支持 - 它只是使用与 Query selectors 相同的语法,后者目前不支持地理空间操作。

我认为你有 3 个选择:

1。使用边界框

您的选择器将如下所示:

"selector": {
  "type": "Property",
  "lat": {
    "$gt": -11
  },
  "lat": {
    "$lt": 11
  },
  "lon": {
    "$gt": 12
  },
  "lon": {
    "$lt": 14
  }
}

如果您需要精确的径向搜索,也许您可​​以进一步限制客户端上的结果。

2。在 JavaScript 过滤器中实现半径搜索

这意味着放弃使用 `selector,会相对较慢(在 Couch/Cloudant 中涉及 JavaScript 的任何东西都会),但会提供您想要的结果。

3。运行查询并复制生成的 ids

使用searchgeospatial 查询获取您需要的一组_id,并使用基于doc_id 的复制来获取它们。

最后,值得考虑的是您是否真的想要复制(这意味着文档能够双向同步)或者您是否只是将数据缓存/复制到客户端。复制除了复制数据之外还会带来一些开销(它需要找出客户端和服务器之间的增量,检索每个文档的 rev 历史记录等)所以,如果您不需要将文档写回服务器,也许你不需要它。

如果您确实沿着复制路线走下去,您可能需要处理以前复制的文档不再与查询匹配的情况,因此更新不会在后续复制中传播。

如果没有,您最好使用include_docs=true 运行查询并手动将文档插入本地数据库。

【讨论】:

  • 目前,需求只是一方面,即服务器到客户端的复制。由于我没有使用 _replicator 端点,因此我假设在 two-way replicationsync 的情况下,我没有得到您在上面谈到的开销?
  • 正确 - 这取决于您如何处理 _changes 结果。如果它不是客户端复制器(PouchDB 等),那么您就没有开销。但是,如果您只需要获取与查询匹配的文档,则使用索引而不是运行时迭代 _changes(实际上是过滤器所做的)可能更有效。如果您担心传输已有的文档,可以分两步进行 - 第一个是从查询中获取 id,另一个是使用 _all_docs 按键获取文档。
  • The selector filter for _changes is not backed by an index - it just uses the same syntax as Query selectors, which currently does not support geospatial operations. 这是否意味着选择器没有使用我在设计文档中放入的基于查询的索引?
【解决方案2】:

用于更改提要的 _selector 过滤器不受索引的支持,它基本上是实现与 javascript 过滤器相同的功能的便捷快捷方式,但速度更快,因为它直接在 Erlang 中执行。

由于它没有索引支持,因此您无法以这种方式利用地理索引。

您最好运行边界框或半径查询以获取 id,然后使用 bulk_get 获取这些文档,或者使用正文中的 id 向 all_docs 发布这些文档。

https://cloudant.com/wp-content/uploads/Cloudant-Geospatial-technical-overview.pdf

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 2015-04-26
    • 2016-02-12
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多