3

我无法在我的坐标系中获得正确的结果。为了解释我的系统,我有一个简单的数据库,它有 x_axis、y_axis 和 name 列。我不需要获取所有数据,我只需要显示其中的一部分。

例如,我有一个 10:10 的坐标系(表示从 x_axis -10 到 10 和从 y_axis -10 到 10),我只想显示 49 个坐标。在 sql 查询中,我可以这样做:“从 x_axis >= -3 and x_axis <= 3 and 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

为了让您更好地了解我的项目,这里是我想要制作的屏幕截图:

4

3 回答 3

2
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)
}

更新以处理动态范围

根据数据库查询 CouchDB 方式

“CouchDB 设计在大型数据集上为您提供了出色的性能。但这意味着您在运行查询时无法将动态参数传递给您的地图函数。”

因此,要进行动态范围,您需要将键值的输出更改为单个值,以便您可以使用 startkey 和 endkey 参数。

function(doc) {
 emit(doc.x * doc.y, doc)
}

使用此过滤器:

by_range?startkey=-9&endkey=9

在您的应用程序中,您可以通过执行类似的操作来计算开始键和结束键

startkey = (x1*y1)
endkey = (x2*y2)
于 2010-01-02T23:18:32.100 回答
0

See these pages:

Basically 2 options:

  1. Use 2 seprate queries and merge the results.
  2. Use couchdb-lucene
于 2010-01-04T20:02:17.817 回答
0

您可以使用本文中描述的技术和多个键执行类似 WHERE 子句的操作。

于 2010-04-18T09:51:05.687 回答