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

时间:2016-09-28 20:32:12

标签: couchdb cloudant

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

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

如您所见,我使用

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

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

2 个答案:

答案 0 :(得分:3)

selector的{​​{1}}过滤器没有索引支持 - 它只使用与Query selectors相同的语法,目前不支持地理空间操作。

我认为你有3个选择:

1。使用边界框

您的选择器看起来像是:

_changes

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

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

这意味着放弃使用`选择器,会相对较慢(任何涉及Couch / Cloudant中的JavaScript的东西),但会给你准确的结果。

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

使用searchgeospatial查询获取所需的_ids集合,并使用基于"selector": { "type": "Property", "lat": { "$gt": -11 }, "lat": { "$lt": 11 }, "lon": { "$gt": 12 }, "lon": { "$lt": 14 } } 的复制来获取它们。

最后,值得考虑的是您是否真的想要复制(这意味着文档能够同时进行同步),或者您是否只是将数据缓存/复制到客户端。除了复制数据之外,复制还需要一些开销(它需要弄清楚客户端和服务器之间的差异,检索每个文档的转换历史记录等),这样,如果您不需要将文档写回到服务器,也许你不需要它。

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

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

答案 1 :(得分:1)

更改源的_selector过滤器没有索引支持,它基本上是一个方便的快捷方式,可以实现与javascript过滤器相同的功能,但更快,因为它直接在Erlang中执行。

由于它不支持索引,因此无法以这种方式使用地理索引。

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

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