如何在CouchDB / Cloudant中执行多维查询

时间:2018-07-13 17:22:41

标签: couchdb cloudant n1ql

我是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

我一直在阅读有关View(缩小地图)的知识,我猜对于第一种查询,我可以为timelatlng创建一个View。然后,我的客户可以执行3个单独的范围查询,针对每个View一次,然后在客户中执行结果文档ID的交集(内部联接)。但是,这显然会将一些处理移到了CouchDB之外,我希望可以在CouchDB本身中完成所有这些工作。

我还刚刚发现CouchSearch(json / lucene)和n1ql存在...对您有帮助吗?

2 个答案:

答案 0 :(得分:0)

您应该可以将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

答案 1 :(得分:-1)

可悲的是,CouchDB在处理这类多维查询方面非常差劲。您可以在任何轴上都有视图,但是没有如您所描述的那样容易的方法来获取相交。

但是,在该项目的早期就编写了一个扩展程序,用于处理称为GeoCouch的GeoSpatial查询(经纬度较长),并且该扩展程序已包含在您似乎正在使用的Cloudant平台中。这意味着您可以使用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轴查询。但是我还没有尝试过。