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