key - couchdb 中两个关键范围的问题

标签 key couchdb range coordinate

我无法在我的坐标系中获得正确的结果。 为了解释我的系统,我有一个简单的数据库,其中包含 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/

相关文章:

python - 如何用星号制作金字塔

excel - 在特殊条件下将一系列单元格粘贴到相同大小的目标范围?

javascript - 如何判断 W 键是否按下

python - 字典中的键和 dict.keys() 中的键有什么区别?

python - 如何使用Python中的字典替换列表中的字符

couchdb - 如何维护 CouchDB、BigCouch 或其他开源数据库中的历史记录(例如 VCS)?

python - 如何根据键而不是轴来减少 numpy 数组?

couchdb - 是否可以让 CouchApp 自动发送请求?

ruby - 我如何使用 CouchRest 和 BCrypt 在 CouchDB 中存储密码?

python - 对于我在范围内(开始,停止,步骤)Python 3