“which skip / skip()”中的反向返回元素

时间:2015-07-31 13:26:38

标签: mongodb mongoose mongodb-query

我正在执行聚合查询,我想在其中选择包含文档数组的单个文档,然后根据条件筛选出来。我想实现一个分页系统,所以我依赖于$skip运算符。

问题在于,即使在订购后,我的文档$skip也会从第一个文档开始,而我希望从最后开始跳过文档。

myCollection.aggregate( {$match : {title : title, available : true} }, 
                        {$unwind : '$versions'},
                         {$match : {'versions.active' : true } }
        ,               {$sort : {'versions.dateAdded' : 1}},
                         {$skip : offset},
                        {$limit : 10} );

其中offset是我要计算的值。

说我有查询选择文件

{
  title : 'ab',
  available : true,
  versions : [{name : 'v1', active : true, dateAdded: ISODATE...},
              {name : 'v2', active : true, dateAdded: ISODATE...},
              {name : 'v3', active : true, dateAdded: ISODATE...},
              {name : 'v4', active : true, dateAdded: ISODATE...},
              {name : 'v5', active : true, dateAdded: ISODATE...}]
}

我希望$skip运算符从最后一个数组元素开始。我认为一个可能的解决方案可能是返回从{$match : {'versions.active' : true}}中选择的元素数量,然后减去偏移量,我尝试了$size运算符,但只返回数组的完整大小只有那些满足条件的元素。

1 个答案:

答案 0 :(得分:2)

我假设因为你的排序不包含“标题”在这里是唯一的任何其他键,如果“跳过/限制”在这里基本适用于你,这似乎就是这种情况。因此,只需“反转”排序顺序:

myCollection.aggregate([
     {$match : {title : title, available : true} }, 
     {$unwind : '$versions'},
     {$match : {'versions.active' : true } }
     {$sort : {'versions.dateAdded' : -1}},
     {$skip : offset},
     {$limit : 10},
     {$sort : {'versions.dateAdded' : 1}}
])

这意味着在列表中“向后”,然后最后$sort在“跳过/限制”之后重新排序列表。