我正在执行一个聚合查询,其中我想选择一个包含文档数组的文档,然后根据一个条件过滤掉该文档。我想要实现一个分页系统,所以我依赖于$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操作符,但它只是返回数组的全部大小,并且只返回那些满足条件的元素。
发布于 2015-07-31 13:40:01
我推测是因为您的排序不包含"title“在这里是唯一的任何其他键,如果”跳过/限制“在这里基本适用的话,情况就是这样。因此,只需“反转”排序顺序:
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在“跳过/限制”之后重新排序列表。
https://stackoverflow.com/questions/31747347
复制相似问题