2016-07-09 27 views
-1

我使用$我在我的Django應用程序AJAX分頁聚集查詢跳過$限制。下面是我的代碼示例:

art_cursor = Articles.objects.aggregate({'match': {'ntype': {'$in': [1,6]}}}, 
    {'$group': {'_id': {'title': '$title'}}}, 
    {'$sort': {'_id.title': -1}}, 
    {'$limit': 51 * page}, {'$skip': 51 * (page-1)}, 
    allowDiskUse=True) 

所以我有一些分類的物品集中,並希望得到他們的唯一部分爲每個頁面,當用戶向下滾動。

但是有些文章在不同的頁面上重複,這意味着如果我將範圍(1,6)循環(用於獲取所有文章從1頁到5頁)的上述代碼,那麼一些文章結果數組將被重複。

可以爲它做什麼解決方法,或者我可以做另一種方法做這樣的事情?

UPD1 順便說一句,如果我刪除$排序操作 - 有在結果數組沒有重複。我不知道爲什麼

+0

你能展示一些數據和被複制的結果? $ in:[1,6]將返回1或6,而不是1到6的值。在我看來,您可能在數據中有重複,但標題略有不同。 – Tiramisu

+0

@Tiramisu這個[1,6]對這個問題沒有任何意義 - 我只是找到匹配1或6類型的文章。重複項是關於我的情況下的對象。 – vadimb

+0

也發佈在DBA上:http://dba.stackexchange.com/questions/143399/mongodb-avoid-sort-limit-optimization。如上所述,'$ group'階段決定了唯一性,它看起來像$ limit和$ skip階段是相反的。一些示例數據來說明問題會有所幫助。 – Stennie

回答

0

好吧,這個問題是關於$排序 + $限制 MongoDB的優化。當我們在$ sort之後得到$ limit時,MongoDB優化器只對我們獲得的$ limit結果的對象進行排序。

源(MongoDB的文檔):https://docs.mongodb.com/manual/core/aggregation-pipeline-optimization/#agg-sort-limit-coalescence

+0

這是聚合中'$ sort + $ limit'優化的錯誤解釋。這種優化允許聚合'$ sort'階段只跟蹤可以被以下'$ limit'階段使用的結果的最大數目(即爲返回的前n個結果有效地分配內存,而不是將整個結果集排序在內存中)。 – Stennie