在另一个中使用来自一个RethinkDB查询的结果?

时间:2015-05-12 15:04:49

标签: javascript node.js rethinkdb

我想发送一个带有地址的http帖子,该帖子将从数据库中获取文档。我想在getNearest函数中使用该doc的地理数据,最终返回最近的其他四个位置。我如何将这两个查询串在一起?

r.table('dealer_locations').filter(function(dealer) {
return {
      dealer :  ("Address").match(request.body.Address)
      .getNearest(dealer, {
            index: 'geodata',
            maxResults: 4
          })
      }
    }).run(conn, function(error, cursor) {
      if (error) {
        handleError(response, error);
      } else {
        cursor.toArray(function(error, results) {
          if (error) {
            handleError(response, error);
          } else {
            response.send(results);
          }
        });
      }
    });

1 个答案:

答案 0 :(得分:3)

我只是为了更清楚地重新阐述问题:

<强>问题

鉴于具有地理数据的特定文档,我还希望将最近的四个位置返回到该位置。

<强>解决方案

首先,确保您要在要查询的表格中创建地理位置索引:

r.point

之后,请确保您已在文档中插入r.point个对象。您不能仅在任何属性上使用地理索引。它们必须是r.table('dealer_locations') .insert({ name: 'San Francisco', location: r.point(37.774929, -122.419416) }) s。

r.table('dealer_locations')
 .filter({ name: 'San Francisco' })(0)
 .do(function (row) {
   return r.table('dealer_locations')
     .getNearest(row('location'), { index: 'location', maxResults: 4 })
 })

在您插入所有文档后,他们在同一属性上都有r.point属性,您为其创建了索引,现在您可以开始查询它们了。

如果您想获取某个地点的所有最近位置,您可以执行以下操作:

r.table('dealer_locations')
 .filter({ name: 'San Francisco' })(0)
 .merge(function (row) {
   return {
     nearest_locations: r.table('dealer_locations')
       .getNearest(row('location'), { index: 'location', maxResults: 4 })
   }
 })

如果要将壁橱位置附加到文档,以便您可以同时返回文档和最近的位置,则可以使用merge方法执行此操作。

address

最后,如果您想根据地址获取所有最近的位置(假设您的文档同时具有带字符串的location属性和带有r.point的{​​{1}}属性),你可以这样做:

r.table('dealer_locations')
 .filter(r.row('address').match(request.body.Address))
 (0) // Only get the first document
 .do(function (row) {
   // Return the 4 documents closest to the 'location' if the previous document
   return r.table('dealer_locations')
     .getNearest(row('location'), { index: 'location', maxResults: 4 })
 })

话虽如此,问题可能在于您可能会匹配多个地址,而这些地址不一定是您想要匹配的地址!