【问题标题】:MongoDB Geospatial Load More Between HTTP RequestsHTTP 请求之间的 MongoDB 地理空间负载更多
【发布时间】:2011-08-10 23:07:16
【问题描述】:

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

【问题讨论】:

  • 如果你的位置或朋友的位置可能发生了变化,其实是“重新扫描”或“重新加载”……前20个可能已经退出前20个。或者你要后20个对数据库的第一次查询?
  • 我也想知道怎么做。对于“重新加载”,我是否会执行相同的请求,但限制为 40 而不是 20?我如何获得第一个查询的下 20 个?

标签: ruby mongodb sinatra geospatial


【解决方案1】:

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

所以,第一个查询将是:

your_query.limit(20)

那么如果你想加载第二个 20(你必须在某处记住第一个查询):

your_query.skip(20).limit(20)

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

【讨论】:

    【解决方案2】:

    更多地将其视为客户端问题:使用基于当前组的订阅 - 如果可能,将组编码为地理正方形(我认为比圆形更有效?) - 定期 (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;
            }
        }
    

    :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-07
      • 1970-01-01
      • 2015-06-07
      • 2012-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多