我正在执行聚合查询,我想在其中选择包含文档数组的单个文档,然后根据条件筛选出来。我想实现一个分页系统,所以我依赖于$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
运算符,但只返回数组的完整大小只有那些满足条件的元素。
答案 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
在“跳过/限制”之后重新排序列表。