如何在 CouchDB/Cloudant 中执行多维查询
How to perform multi-dimensional queries in CouchDB/Cloudant
我是 CouchDB/Cloudant 的初学者,我希望得到专家的建议,了解执行多维查询的最合适方法。
例子...
我的文档是这样的
{
_id: 79f14b64c57461584b152123e3924516,
lat: -71.05204477,
lng: 42.36674199,
time: 1531500769,
tileX: 5,
tileY: 10,
lod: 7,
val1: 200.1,
val2: 101.5,
val3: 50
}
lat
、lng
、time
为查询参数,将按范围查询。
例如获取所有具有
的文档
lat_startkey = -70 & lat_endkey = -72 AND
lng_startkey = 50 & lng_endkey = 40 AND
time_startkey = 1531500769 & time_endkey = 1530500000
我还将使用 time
作为范围进行查询,并使用 tileX
、tileY
、lod
作为精确值
For example
tileX = 5 AND
tileY = 10 AND
lod = 7 AND
time_startkey = 1531500769 & time_endkey = 1530500000
我一直在阅读有关视图(地图缩减)的信息,我想对于第一种查询类型,我可以为 time
、lat
、lng
创建一个视图.然后我的客户端可以执行 3 个单独的范围查询,一个针对每个视图,然后在客户端中执行结果文档 ID 的交集(内部连接)。然而,这显然将一些处理转移到 CouchDB 之外,我希望我可以在 CouchDB 本身内完成这一切。
我刚刚还发现 CouchSearch (json/lucene) 和 n1ql 存在...这些有什么帮助吗?
您应该能够毫无问题地使用 N1QL 查询语言进行此类查询。 N1QL 仅适用于 Couchbase,不适用于 Couchbase 的 CouchDB 项目。
例如,如果我理解你在那里的第一个查询,你可以在 N1QL 中这样写:
SELECT *
FROM datapoints
WHERE lat BETWEEN -72 AND -70 AND
lng BETWEEN 40 AND 50 AND
time BETWEEN 1531500769 AND 1530500000
为了运行这样的查询高效,你需要一个索引,像这样:
CREATE INDEX lat_long_time_idx ON datapoints(lat, lng, time)
您可以在此处找到有关 N1QL 的更多信息:
https://query-tutorial.couchbase.com/tutorial/#1
遗憾的是,CouchDB 在处理这类多维查询方面非常糟糕。您可以在任何轴上查看,但没有简单的方法来检索交点,正如您所描述的那样。
但是,在该项目的早期编写了一个名为 GeoCouch 的扩展来处理地理空间查询(纬度、经度),并且该扩展已包含在您似乎正在使用的 Cloudant 平台中。这意味着您可以直接查询 lat/long 组合,而不是使用 GeoJSON 格式的时间轴:https://console.bluemix.net/docs/services/Cloudant/api/cloudant-geo.html#cloudant-nosql-db-geospatial
然而 Cloudant 还有另一个查询系统——查询:https://console.bluemix.net/docs/services/Cloudant/api/cloudant_query.html#query
在此系统下,您可以对文档建立任意索引,然后查询具有特定条件的文档。例如,此查询选择器将查找年份在 1900-1903 范围内的文档:
{
"selector": {
"year": {
"$gte": 1900
},
"year": {
"$lte": 1903
}
},
所以在我看来,您似乎可以为您关心的三个值(纬度、经度和时间)建立索引,并在 Cloudant 中构建一个 3 轴查询。不过我自己没试过。
我是 CouchDB/Cloudant 的初学者,我希望得到专家的建议,了解执行多维查询的最合适方法。
例子... 我的文档是这样的
{
_id: 79f14b64c57461584b152123e3924516,
lat: -71.05204477,
lng: 42.36674199,
time: 1531500769,
tileX: 5,
tileY: 10,
lod: 7,
val1: 200.1,
val2: 101.5,
val3: 50
}
lat
、lng
、time
为查询参数,将按范围查询。
例如获取所有具有
lat_startkey = -70 & lat_endkey = -72 AND
lng_startkey = 50 & lng_endkey = 40 AND
time_startkey = 1531500769 & time_endkey = 1530500000
我还将使用 time
作为范围进行查询,并使用 tileX
、tileY
、lod
作为精确值
For example
tileX = 5 AND
tileY = 10 AND
lod = 7 AND
time_startkey = 1531500769 & time_endkey = 1530500000
我一直在阅读有关视图(地图缩减)的信息,我想对于第一种查询类型,我可以为 time
、lat
、lng
创建一个视图.然后我的客户端可以执行 3 个单独的范围查询,一个针对每个视图,然后在客户端中执行结果文档 ID 的交集(内部连接)。然而,这显然将一些处理转移到 CouchDB 之外,我希望我可以在 CouchDB 本身内完成这一切。
我刚刚还发现 CouchSearch (json/lucene) 和 n1ql 存在...这些有什么帮助吗?
您应该能够毫无问题地使用 N1QL 查询语言进行此类查询。 N1QL 仅适用于 Couchbase,不适用于 Couchbase 的 CouchDB 项目。
例如,如果我理解你在那里的第一个查询,你可以在 N1QL 中这样写:
SELECT *
FROM datapoints
WHERE lat BETWEEN -72 AND -70 AND
lng BETWEEN 40 AND 50 AND
time BETWEEN 1531500769 AND 1530500000
为了运行这样的查询高效,你需要一个索引,像这样:
CREATE INDEX lat_long_time_idx ON datapoints(lat, lng, time)
您可以在此处找到有关 N1QL 的更多信息: https://query-tutorial.couchbase.com/tutorial/#1
遗憾的是,CouchDB 在处理这类多维查询方面非常糟糕。您可以在任何轴上查看,但没有简单的方法来检索交点,正如您所描述的那样。
但是,在该项目的早期编写了一个名为 GeoCouch 的扩展来处理地理空间查询(纬度、经度),并且该扩展已包含在您似乎正在使用的 Cloudant 平台中。这意味着您可以直接查询 lat/long 组合,而不是使用 GeoJSON 格式的时间轴:https://console.bluemix.net/docs/services/Cloudant/api/cloudant-geo.html#cloudant-nosql-db-geospatial
然而 Cloudant 还有另一个查询系统——查询:https://console.bluemix.net/docs/services/Cloudant/api/cloudant_query.html#query
在此系统下,您可以对文档建立任意索引,然后查询具有特定条件的文档。例如,此查询选择器将查找年份在 1900-1903 范围内的文档:
{
"selector": {
"year": {
"$gte": 1900
},
"year": {
"$lte": 1903
}
},
所以在我看来,您似乎可以为您关心的三个值(纬度、经度和时间)建立索引,并在 Cloudant 中构建一个 3 轴查询。不过我自己没试过。