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

如何在CouchDB/Cloudant中执行多维查询,couchdb,cloudant,n1ql,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 } lat

我是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
我一直在阅读有关视图(map reduce)的文章,我想对于第一种类型的查询,我可以为
时间
纬度
液化天然气
创建一个视图。然后,我的客户机可以执行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的更多信息:
可悲的是,CouchDB在处理这类多维查询方面非常糟糕。您可以在任何轴上拥有视图,但没有简单的方法检索交点,如您所述

然而,在该项目的早期,编写了一个名为GeoCoach的扩展来处理地理空间查询(lat,long),该扩展已经包含在您似乎正在使用的Cloudant平台中。这意味着您可以对lat/long组合进行直接查询,而不是使用GeoJSON格式的时间轴:

但是,Cloudant还有另一个查询系统-查询:

在这个系统中,您可以为文档建立一个任意索引,然后查询具有特定条件的文档。例如,此查询选择器将查找年份在1900-1903之间的文档:

{
"selector": {
    "year": {
        "$gte": 1900
    },
    "year": {
        "$lte": 1903
    }
},

因此,在我看来,您似乎可以索引您关心的三个值(Lat、Long和Time),并在Cloudant中构建一个三轴查询。但是,我自己还没有尝试过。

在CouchDB中没有完全实现这一点的有效方法。谢谢,我正在使用Cloudant,不幸的是N1QL不可用。但是Cloudant查询(Mango)是可用的,所以我将尝试使用它。