我是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
我一直在阅读有关View(缩小地图)的知识,我猜对于第一种查询,我可以为time
,lat
,lng
创建一个View。然后,我的客户可以执行3个单独的范围查询,针对每个View一次,然后在客户中执行结果文档ID的交集(内部联接)。但是,这显然会将一些处理移到了CouchDB之外,我希望可以在CouchDB本身中完成所有这些工作。
我还刚刚发现CouchSearch(json / lucene)和n1ql存在...对您有帮助吗?
答案 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轴查询。但是我还没有尝试过。