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
_changes
的 selector
过滤器不受索引支持 - 它仅使用与 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
进行查询并手动将文档插入本地数据库。
目前我正在通过监控以下资源进行过滤复制:
_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
_changes
的 selector
过滤器不受索引支持 - 它仅使用与 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
进行查询并手动将文档插入本地数据库。