Cloudant couchdb 更改 api 和地理空间索引

Cloudant couchdb changes api and geospatial indexes

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

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

如您所见,我正在使用

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

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

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

由于它不是索引支持的,因此您不能以这种方式利用地理索引。

您最好 运行 边界框或半径查询来获取 ID,然后使用 bulk_get 或 post 获取这些文档到 all_docs 正文中包含 ID。

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

_changesselector 过滤器不受索引支持 - 它仅使用与 Query selectors 相同的语法,目前不支持地理空间操作。

我认为你有 3 个选择:

1。使用边界框

您的选择器将类似于:

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

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

2。在 JavaScript 过滤器

中实施半径搜索

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

3。 运行 查询并复制结果 ID

使用 search or geospatial 查询获取所需的 _id 集,并使用基于 doc_id 的复制来获取它们。

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

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

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