2017-01-12 48 views
3

試想一下,當客戶端已經喂對象有限制的情況10.
當需要在未來10發送帶有跳過10,並限制10MongoDB的API分頁

但是如果有一些新的對象被要求從偏移量== 0的第一個請求開始添加(或刪除)到收集。

然後在第二個請求(偏移量爲== 10)響應可能有錯誤的對象順序。

按照創建時間排序在這裏不起作用,因爲我有一些在通過某個數字字段排序時形成的提要。

+2

這不僅僅是一個MongoDB的問題,它適用於任何企圖對不斷變化的數據庫分頁。參見http://stackoverflow.com/questions/9394668/pagination-on-fast-changing-database-content –

回答

1

您可以添加一個時間字段像created_at或的updated_at。它必須在創建或修改文檔時更新,並且該字段必須是唯一的。

然後在此時間字段中使用$ gte和$ lte 以及排序查詢數據庫的時間範圍。

這保證了時間窗口之外所做的任何更改將不會體現在分頁,只要時間字段沒有重複。最有可能的是,如果你包括microtime,重複不會發生。

1

這真的取決於你想要得到的結果是什麼。

如果你想在原來的順序原始對象,而刪除和添加操作,那麼你需要通過使列表的副本(或至少的順序),然​​後頁面。將每個ID複製到一個新的集合中,該集合在頁面加載後不會更改,然後通過分頁進行分頁。

另外,也許更有可能的是,您想要查看當前集合中最後一個之後的下一個10,包括之後發生的任何刪除或添加操作。爲此,您可以使用您正在查看它們的排序順序和過濾器,$ gt無論最後一項是什麼。但是,如果您在排序的字段中存在重複項,則此功能無效。爲了解決這個問題,您需要在該字段上加上索引,併爲每個記錄添加一些唯一的字段,例如_id字段。現在,您可以獲取第一個集合中的最後一條記錄,並查找$ eq爲索引值的記錄,$ gt爲_id OR僅僅是$ gt索引值。