【问题标题】:Reverse way in "which $skip/skip()" returns elements“which $skip/skip()”返回元素的反向方式
【发布时间】:2015-07-31 21:40:01
【问题描述】:

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

问题是,即使在订购了我的文档之后,$skip 也会从 first 文档开始,而我希望从末尾开始跳过这些文档。

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 运算符,但它只返回数组的完整大小,并且只有那些元素满足条件。

【问题讨论】:

    标签: mongodb mongoose mongodb-query


    【解决方案1】:

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

    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 在“跳过/限制”之后重新排序列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      • 2018-03-05
      相关资源
      最近更新 更多