【问题标题】:How to paginate in MongoDB with aggregate如何在 MongoDB 中使用聚合进行分页
【发布时间】:2020-09-15 14:50:39
【问题描述】:

我有一组文档,每个文档都有一个 groupID。我只能从每个组中检索一个文档,但我不确定如何进行有效的分页。 示例:

{
     unitquantity: "2"
     itemcode: "842852100008"
     name: "Atlas Black"
     price: "39990"
     size: "s"
     groupid: "40bf6073-a1d3-4ffa-9ced-dd2f5fcd1b5e",
},
{
     unitquantity: "2"
     itemcode: "842852100382"
     name: "Atlas Black"
     price: "39990"
     size: "m"
     groupid: "40bf6073-a1d3-4ffa-9ced-dd2f5fcd1b5e",
},
{
     unitquantity: "2"
     itemcode: "842852100746"
     name: "Atlas Black"
     price: "39990"
     size: "xl"
     groupid: "40bf6073-a1d3-4ffa-9ced-dd2f5fcd1b5e",
},

这 3 个项目具有相同的 groupid,但它们的大小不同。我只需要从组中检索一个,没有关系(在这种情况下,它是大小)。

我可以这样做:

var query = {[`category.${type}`]: `${type}`}
var query = {[`category.${type}`]: `${type}`}
db.collection('products').aggregate([
     { $match: query },
     {
          $group: {
               _id: "$groupid",
               images: { $last: "$images" },
               description: { $last: "$description" },
               barcode: { $last: "$barcode" },
               category: { $last: "$category" },
               subcategory: { $last: "$subcategory" }, 
               id: { $last: "$_id" }
          }
     },
     { $sort: {'_id': -1} },
     { $limit: 30 }
]).toArray().then(result=>{
     lastKey = result[result.length - 1].id
     groupId = result[result.length - 1].groupid
})

我将最后一个 groupId 存储到变量中。当我按下加载按钮时,我希望下一个 30 出现。这是我的加载代码,除了 $match 的查询使用文档的 _id 之外,基本完全相同:

var query = {[`category.${type}`]: `${type}`, 'groupid': { $ne: `${groupId}`}, '_id': {$gt: lastKey}}
db.collection('products').aggregate([
     { $match: query },
     {
          $group: {
               _id: "$groupid",
               groupid: { $last: "$groupid" },
               images: { $last: "$images" },
               description: { $last: "$description" },
               barcode: { $last: "$barcode" },
               category: { $last: "$category" },
               subcategory: { $last: "$subcategory" }, 
               id: { $last: "$_id" }
          }
     },
     { $sort: {'_id': -1} },
     { $limit: 30 },
]).toArray().then(result => {
    lastKey = result[result.length - 1].id
    groupId = result[result.length - 1]._id
})

但是我得到很多重复自己的东西。 我看到其他与 $group 和 $sort 类似的问题,有些需要在 $group 之前和之后使用 $sort ,但这对我不起作用。我真的不知道如何根据文档 _id 正确地对它们进行排序。

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    您可以将 $skip 与页数结合使用。你必须管理页数状态 客户

     db.collection('products').aggregate([
      { $match: query },
      {
          $group: {
               _id: "$groupid",
               groupid: { $last: "$groupid" },
               images: { $last: "$images" },
               description: { $last: "$description" },
               barcode: { $last: "$barcode" },
               category: { $last: "$category" },
               subcategory: { $last: "$subcategory" }, 
               id: { $last: "$_id" }
          }
     },
      { $sort: {'_id': -1} },
      { $skip: 30 * page },
      { $limit: 30 },
    ]).toArray().then(result => {
    
     lastKey = result[result.length - 1].id
     groupId = result[result.length - 1]._id
    
    })
    

    【讨论】:

    • 这真的行不通。它跳过了很多项目。
    猜你喜欢
    • 2018-06-26
    • 2019-05-19
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多