如何在 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
}

latlngtime为查询参数,将按范围查询。 例如获取所有具有

的文档
 lat_startkey = -70 & lat_endkey = -72  AND
 lng_startkey = 50 & lng_endkey = 40  AND
 time_startkey = 1531500769 & time_endkey = 1530500000

我还将使用 time 作为范围进行查询,并使用 tileXtileYlod 作为精确值

For example
tileX = 5 AND
tileY = 10 AND
lod = 7 AND
time_startkey = 1531500769 & time_endkey = 1530500000

我一直在阅读有关视图(地图缩减)的信息,我想对于第一种查询类型,我可以为 timelatlng 创建一个视图.然后我的客户端可以执行 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 轴查询。不过我自己没试过。