2015-05-12 2 views
2

Я хочу отправить сообщение http с адресом, который доставит документ из базы данных. Я хотел бы использовать геоданные этого документа в функции getNearest, в конечном счете вернув ближайшие четыре других местоположения. Как мне объединить эти два запроса вместе?Использование результатов одного запроса RethinkDB в другом?

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); 
      } 
     }); 
     } 
    }); 
+0

Можете ли вы показать, что вы пробовали? Было бы легче работать с начальной точкой. Он также может уточнить некоторые вопросы, которые могут возникнуть в отношении настройки. – Trott

+0

Добавлен код выше :) –

ответ

3

Я переформулировать вопрос только, чтобы сделать немного более ясным:

Проблема

Учитывая конкретный документ с геоданных, я хочу также вернуть четыре ближайших местах в том, что место нахождения.

Решение

Во-первых, убедитесь, что вы создать индекс гео в таблице вы хотите запросить:

r.table('dealer_locations').indexCreate('location', { geo: true }) 

После этого, убедитесь, что вы вставили r.point объекта в документ. Вы не можете просто использовать геоиндекс только для любого свойства. Они должны быть r.point с.

r.table('dealer_locations') 
    .insert({ 
    name: 'San Francisco', 
    location: r.point(37.774929, -122.419416) 
    }) 

После того, как вы вставили все документы и все они имеют r.point свойству объекта на той же собственности вы создали индекс для, теперь вы можете начать запрашивая их.

Если вы хотите, чтобы получить все ближайшие места для местоположения, вы можете сделать следующее:

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

Если вы хотите добавить кладовых места в документе, так что вы можете вернуть как документ и ближайших местах одновременно, вы можете сделать это, используя метод merge.

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

Наконец, если вы хотите, чтобы получить все ближайшие пункты, основанные на адресе (предположим, ваш документ имеет как address свойство со строкой и location свойство с r.point), вы можете сделать что-то подобное :

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

это, как говорится, проблема с этим может быть, что вы могли бы соответствовать несколько адресов, которые не обязательно являются те, которые вы хотите, чтобы соответствовать!

+0

Это решение немного отличается от того, что мне нужно, но вы указали мне в правильном направлении, где я понял, что остальное. Благодаря! –

+0

Удивительный! Просто из любопытства, что было по-другому? –

+0

Мне нужно было интегрировать создание индекса со вставкой, чтобы можно было сделать все в одной функции (загружая таблицу Excel). Однако у меня есть один вопрос о вашем последнем фрагменте кода. Я хочу вернуть 4 ближайших адреса в тот, который я даю в теле запроса, но в настоящее время я только возвращаюсь 1. Это связано с (0), которое у вас есть за фильтром? –

Смежные вопросы