我无法在我的坐标系中获得正确的结果。 为了解释我的系统,我有一个简单的数据库,其中包含 x_axis、y_axis 和名称列。我不需要获取所有数据,我只需要显示其中的一部分。
例如,我有一个 10:10 的坐标系(意思是从 x_axis -10 到 10 和从 y_axis -10 到 10),我只想显示 49 个坐标。在 sql 查询中,我可以这样做: “从 x_axis >= -3 且 x_axis <= 3 且 y_axis >= -3 y_axis <= 3 的坐标中选择 *”
我试过这个功能但没有成功:
"by_range": {
"map": "function(doc) { emit([doc.x_axis, doc.y_axis], doc) }"
}
by_range?startkey=[-3,-3]&endkey=[3,3]
我得到了错误的结果:
-3x-3 -3x-2 -3x-1 -3x0 -3x1 -3x2 -3x3 <-- 不应该显示这部分 --> -3x4 -3x5 -3x6 -3x7 -3x8 -3x9 -3x10 <-- 结束不应该显示这部分 --> ..... 最多 3x3
为了让您更好地了解我的项目,这里是我想要制作的屏幕截图:
最佳答案
by_range?startkey=[-3,-3]&endkey=[3,3]
您将其用作 WHERE 子句。 Couchdb 不理解“startkey”和“endkey”中的值,它只是使用它们来知道何时开始和停止输出结果。
例如,取下面的结果集:
doc1
doc2
doc3
doc4
如果我应用这个查询:
?startkey=doc2&endkey=doc3
结果集将是:
doc2
doc3
要在您的示例中应用一个范围,我会修改 map 函数:
function(doc) {
if (doc.x <= 3 && doc.x >= -3 && doc.y <= 3 && doc.y >= -3)
emit([doc.x, doc.y], doc)
}
处理动态范围的更新:
根据 Database Queries the CouchDB Way :
"The CouchDB design gets you great performance on large data sets. But it means that you cannot pass dynamic parameters to your map function when you run a query."
所以要进行动态范围,您需要将键值的输出更改为单个值,以便您可以使用 startkey 和 endkey 参数。
function(doc) {
emit(doc.x * doc.y, doc)
}
使用这个过滤器:
by_range?startkey=-9&endkey=9
在您的应用程序中,您可以通过执行以下操作来计算开始和结束键
startkey = (x1*y1)
endkey = (x2*y2)
关于key - couchdb 中两个关键范围的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1991598/