我在 CouchDB 中有一组地理定位的文档 - 也就是说,它们的结构类似于
{
_id: ...,
...
coords: {
lat: 45.204149214,
long: 40.284712972
}
}
我希望能够在地图上显示它们。这要求我获取给定方块中的所有文档。在给定的时间间隔内获取所有带有经度的文档很容易:
// map function
function(doc) {
emit(doc.coords.long, doc.other_stuff);
}
使用类似
// query
/path/to/view/?startkey=40&endkey=50
问题是我不知道如何进行多维约束。如何获取纬度在 20 到 30 之间、经度在 40 到 50 之间的所有文档?我看到我可以指定多个键,但那会或结果。
一种选择是在客户端上进行进一步筛选,但考虑到数据的大小,这可能是不可行的。
免责声明:SO上有几个类似的问题,基本上说明这是不可能的。由于它们看起来都过时了,我想知道最新版本的 CouchDB 中是否有一些变化。
你是对的,你不能做多维查询。但是有GeoCouch。通过build-couchdb添加到沙发数据库非常容易,或者您可以使用默认情况下已将其烘焙的iriscouch托管。
如您所见,使用Geocouch相当容易,查询采用如下边界框:
http://localhost:5984/places/_design/main/_spatial/points?bbox=0,0,180,90
如果你不想使用geocouch(出于某种原因),我已经成功地使用了GeoHash,它将两个维度映射到一个维度空间。 下面是视图代码,下面是查询。如您所见,它没有那么优雅,但它可以在couchdb版本之间移植,并且也可以工作。