2016-07-09 29 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