MongoDB地理空间在HTTP请求之间加载更多内容

时间:2011-04-22 12:45:47

标签: ruby mongodb sinatra geospatial

AcaniUsers从我的iPhone最接近我的MongoDB(通过Sinatra的Heroku)加载前20个用户。我想添加一个Load More按钮,它将加载最接近我的下20个用户。请注意,我的位置和手机上用户的位置可能已更改。我正在考虑从Sinatra切换到Node.js并打开一个WebSocket,所以我可以实时更新存在和用户在我手机上的位置,但我想我应该为下一次迭代保存这个挑战。基本上,我应该如何实现加载更多功能?

2 个答案:

答案 0 :(得分:0)

要在MongoDB中对查询进行分页,可以使用limit()和skip()的组合。

所以,第一个查询将是:

  
    

your_query.limit(20)

  

然后,如果你想加载第二个20(你必须记住某个地方的第一个查询):

  
    

your_query.skip(20).limit(20)

  

btw我建议你首先执行限制高于20的查询,并在缓存中放入你不显示的结果。请求时,只需从缓存中获取它们(您可以将其存储在用户会话中)。如果位置发生变化,请从头开始重新查询数据库,使缓存无效。

答案 1 :(得分:0)

更多地将其视为客户端问题:使用基于当前组的订阅 - 如果可能,将组编码为地理广场(我觉得比圆圈效率更高?) - 定期(t)执行一个操作检查每个用户的位置,然后使用组ID发送它们以匹配订阅

实际上......要构建您的订阅组,只需对所有订阅者使用geonear命令即可 - 构建订阅者及其组的哈希值 - 每个订户都订阅了一个组和他们自己(用于目标通信=>表示特定订户应该更改他们的订阅) - 迭代结果i次数,其中i是更新组中的个体数量 - 执行一项操作,检查j的当前值,即特定用户的组号,与新的j值相对 - 如果有更改,则通知用户在子用户的私有信道上 - 通知同步跟踪用户调整

类似的东西:

    var pageSize;
    // assign pageSize in method call
    var documents = collection.Find(query);
    var max = documents.Size();
    for (int i = 0; i == max ; i++)
    {
        var level = i*pageSize;
        if (max / level > 1)
        {
            documents.Skip(pageSize);
        }
        else
        {
            documents.Skip(pageSize).Limit(level);
            break;
        }
    }

:)