我如何 运行 在 RethinkDB 中对 getNearest() 查询进行筛选?

How do I run a filter on a getNearest() query in RethinkDB?

我有一个 table,用户及其位置保存为 r.point 数据类型,并在其上设置了 geo 索引。我正在尝试 运行 一个 .getNearest() 查询,其中 return 是最接近给定用户的所有用户(例如,X 先生 )。结果 return 所有最接近 先生的用户。 X,还包括先生。 X。如何过滤所有用户 except 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`
    

    这 return 是所有用户,包括 先生。 X。尝试 #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'));
    

    这个return没什么。

  2. thinky 中,一个用于 RethinkDB 的 Node.js ORM。

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

    这 return 是所有用户,包括 先生。 X.

我已经知道的一个解决方案 —

使用 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 服务器上比在我这边是 运行。这里有改进的余地吗?或者也许是我忽略的更好的解决方案?

你真的做对了而且差不多了。您只是碰巧使用了错误的密钥 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 returns 文档数组。每个文档都有两个字段:distdoc(这是 table 中的文档本身)。因此这里我们使用 user('doc')('id') 来获取密钥。 https://rethinkdb.com/api/javascript/get_nearest/
  2. filter函数中,我们必须使用ReQL命令,在这种情况下,ne的意思是,不等于。 https://www.rethinkdb.com/api/javascript/ne/

这很快,因为我们有位置索引。 filter 函数在 RethinkDB 服务器上执行。