如何在CouchDB/Cloudant中执行多维查询
我是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
{
_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)是可用的,所以我将尝试使用它。