Как запустить фильтр для запроса getNearest() в RethinkDB?
У меня есть таблица с пользователями и их местоположениями, сохраненными как r.point
типы данных и geo
Индекс установлен на них. Я пытаюсь запустить .getNearest()
запрос, который возвращает всех пользователей, ближайших к данному пользователю (скажем, Mr. X). Результаты возвращают всех пользователей, наиболее близких к Mr. X, но также включают Mr. X. Как мне отфильтровать всех пользователей, кроме Mr. X?
Что я пробовал до сих пор -
В проводнике данных 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'));
Это ничего не возвращает.
В 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')
})
Ключ тонкий:
getNearest
возвращает массив документов. Каждый документ имеет два поля:dist
а такжеdoc
(который является документом в самой таблице). Следовательно, здесь мы используемuser('doc')('id')
чтобы получить ключ. https://rethinkdb.com/api/javascript/get_nearest/- внутри
filter
функция, мы должны использовать команду ReQL, в этом случаеne
значит, не равно. https://www.rethinkdb.com/api/javascript/ne/
Это быстро, потому что у нас есть индекс на месте. А также filter
Функция выполняется на сервере RethinkDB.