Как запустить фильтр для запроса getNearest() в RethinkDB?

У меня есть таблица с пользователями и их местоположениями, сохраненными как r.point типы данных и geo Индекс установлен на них. Я пытаюсь запустить .getNearest() запрос, который возвращает всех пользователей, ближайших к данному пользователю (скажем, Mr. X). Результаты возвращают всех пользователей, наиболее близких к Mr. X, но также включают Mr. X. Как мне отфильтровать всех пользователей, кроме Mr. X?

Что я пробовал до сих пор -

  1. В проводнике данных RethinkDB (простые команды ReQL)

    r.db('myDb').table('myTable').getNearest(r.point(-20, 39), {index: 'location'}).filter(function(user) {return user.id !== '2ff8902e-97f0-431a-a51c-900a57532967'}); // Assuming Mr.X's `id` is `2ff8902e-97f0-431a-a51c-900a57532967`
    

    Это возвращает всех пользователей, включая г-на Х. Попытка № 2 была -

    r.db('myDb').table('myTable').getNearest(r.point(-20, 39), {index: 'location', maxDist:9000000}).filter(r.row('id').ne('2ff8902e-97f0-431a-a51c-900a57532967'));
    

    Это ничего не возвращает.

  2. В Thinky, Node.js ORM для RethinkDB.

    UserModel.getNearest(r.point(-20, 39), {index: 'location'}).filter(function(user) {return user.id !== '2ff8902e-97f0-431a-a51c-900a57532967'}).run();
    

    Это возвращает всех пользователей, включая г-на Х.

Одно решение, о котором я уже знаю -

Используя Thinky, я могу это сделать.

const userId = '2ff8902e-97f0-431a-a51c-900a57532967';
const location = r.point(-20, 39);
const queryOptions = {index: 'location'};
UserModel.getNearest(location, queryOptions).run().then(function (users) {
  return users.filter(function(user) {
    return user.doc.id !== userId;
  });
});

У меня есть чувство, что я могу сделать это быстрее; убедившись, что либо .filter() или на сервере RethinkDB выполняется другая альтернативная функция, чем на моем конце. Есть ли здесь место для улучшения? Или, возможно, более хорошее решение, которое я пропускаю?

1 ответ

Решение

Вы на самом деле делаете это правильно и почти там. Вы просто случайно используете filter с неправильным ключом.

r.db('myDb').table('myTable').getNearest(r.point(-20, 39), {index: 'location'})
    .filter(function(user) {
           return user('doc')('id').ne('2ff8902e-97f0-431a-a51c-900a57532967')
    })

Ключ тонкий:

  1. getNearest возвращает массив документов. Каждый документ имеет два поля: dist а также doc(который является документом в самой таблице). Следовательно, здесь мы используем user('doc')('id') чтобы получить ключ. https://rethinkdb.com/api/javascript/get_nearest/
  2. внутри filter функция, мы должны использовать команду ReQL, в этом случае ne значит, не равно. https://www.rethinkdb.com/api/javascript/ne/

Это быстро, потому что у нас есть индекс на месте. А также filter Функция выполняется на сервере RethinkDB.

Другие вопросы по тегам