2011-04-22 67 views
2

AcaniUsers從我的iPhone中加載最接近我的MongoDB中的前20名用戶(通過Sinatra在Heroku上)。我想添加一個「加載更多」按鈕,以加載接近我的下20個用戶。請記住,我的位置和用戶在我手機上的位置可能已更改。我正在考慮從Sinatra切換到Node.js並打開WebSocket,所以我可以實時更新用戶在手機上的位置&,但我認爲我應該爲下一次迭代保存這一挑戰。基本上,我應該如何實現負載更多的功能?MongoDB地理空間在HTTP請求之間加載更多

+0

如果你的位置或朋友的位置可能會改變,它實際上是一個「重新掃描「或」重新加載「......前20名可能已經退出前20名你想第一個查詢的下一個20到數據庫? – ALoR 2011-04-22 18:04:55

+0

我想知道如何做。對於「重新加載」,我是否會做同樣的請求,但限制爲40而不是20?我如何獲得第一個查詢的下20個? – ma11hew28 2011-04-24 01:31:42

回答

0

要爲MongoDB中的查詢分頁,您可以使用limit()和skip()的組合。

所以,第一個查詢將是:

your_query.limit(20)

這時如果要加載第二個20(你必須記住第一個查詢地址):

your_query.skip(20 ).limit(20)

順便說一句,我建議你在首位,高於20,並放入緩存你不顯示結果的限制執行查詢。請求時,只需從緩存中獲取它們(您可以將其存儲在用戶會話中)。如果位置發生變化,請重新啓動並重新查詢使緩存無效的數據庫。

0

更多地將它看作是客戶端問題:使用基於當前組的訂閱 - 如果可能,將組編碼爲地理方塊(我認爲是更有效的) - 週期性地(t)執行操作檢查每個用戶的位置,並簡單地將它們與組ID綁定以匹配訂閱

實際上......構建您的訂閱組,只需在所有訂閱者上使用geonear命令 - 構建哈希值您的訂戶和他們的團體 - 每個訂閱者訂閱了一個組和他們自己(針對有針對性的溝通=>表示特定訂戶應該更改訂閱) - 通過res ults i i次數,其中i是更新組中的個人數 - 執行一個操作,該操作檢查j的當前值(特定訂戶的組編號)與新的j值 - 如果發生更改,則通知在subsriber的專用通道 用戶 - 通知同步跟隨用戶調整

類似:

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; 
     } 
    } 

:)