Javascript 如何在数据库中的getNearest()查询上运行筛选器?

Javascript 如何在数据库中的getNearest()查询上运行筛选器?,javascript,rethinkdb,thinky,Javascript,Rethinkdb,Thinky,我有一个包含用户及其位置的表,保存为r.pointdatatypes&ageo索引集。我正在尝试运行一个.getNearest()查询,该查询返回与给定用户(例如,X先生)最近的所有用户。结果返回最接近X先生的所有用户,但也包括X先生。如何筛选除X先生之外的所有用户 到目前为止我所尝试的- 在DB的数据资源管理器中(普通ReQL命令) 这将返回所有用户,包括X先生。尝试#2是- 这不会返回任何结果 在中,一个Node.js ORM用于数据库 UserModel.getNearest(r.poin

我有一个包含用户及其位置的表,保存为
r.point
datatypes&a
geo
索引集。我正在尝试运行一个
.getNearest()
查询,该查询返回与给定用户(例如,X先生)最近的所有用户。结果返回最接近X先生的所有用户,但也包括X先生。如何筛选除X先生之外的所有用户

到目前为止我所尝试的-

  • 在DB的数据资源管理器中(普通ReQL命令)

    这将返回所有用户,包括X先生。尝试#2是-

    这不会返回任何结果

  • 在中,一个Node.js ORM用于数据库

    UserModel.getNearest(r.point(-20, 39), {index: 'location'}).filter(function(user) {return user.id !== '2ff8902e-97f0-431a-a51c-900a57532967'}).run();
    
    这将返回所有用户,包括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()
    或其他替代功能,而不是在我的终端上运行。这里还有改进的余地吗?或者是我忽略的一个更好的解决方案?

    你实际上做得很正确,而且几乎做到了。你只是碰巧用错了键使用了
    过滤器

    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')
    来获取密钥
  • filter
    函数中,我们必须使用ReQL命令,在这种情况下,
    ne
    平均值不相等
    这很快,因为我们有位置索引。在数据库服务器上执行
    filter
    功能

    谢谢!我自己也非常接近这个解决方案。对于任何希望在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;
      });
    });
    
    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')
        })