首页 > 解决方案 > MongoDB在聚合查询中分页

问题描述

我在 MongoDB 中有以下集合

配置文件集合

> db.Profile.find()
{ "_id" : ObjectId("5ec62ccb8897af3841a46d46"), "u" : "Test User", "is_del": false }

店铺收藏

> db.Store.find()
{ "_id" : ObjectId("5eaa939aa709c30ff4703ffd"), "id" : "5ec62ccb8897af3841a46d46",  "a" : { "ci": "Test City", "st": "Test State" }, "ip" : false }, "op" : [ ], "b" : [ "normal" ], "is_del": false}

物品收藏

> db.Item.find()
{ "_id" : ObjectId("5ea98a25f1246b53a46b9e10"), "sid" : "5eaa939aa709c30ff4703ffd", "n" : "sample", "is_del": false}

这些集合之间的关系定义如下:

  1. Profile -> Store: 是1:n关系。idin的字段Store与in 的_id字段相关Profile
  2. Store-> Item:这也是1:n关系。sidin的字段Item与in 的_id字段相关Store

我有一个查询来查找所有配置文件商店以及Item每个商店的数量。查询如下(我从答案中得到)

db.Profile.aggregate([
  {
    $match: { is_del: false }
  },
  {
    $lookup: {
      from: "Store",
      as: "stores",
      let: {
        pid: { $toString: "$_id" }
      },
      pipeline: [
        {
          $match: {
            is_del: false,
            $expr: { $eq: ["$$pid", "$id"] }
          }
        },
        {
          $lookup: {
            from: "Item",
            as: "items",
            let: {
              sid: { $toString: "$_id" }
            },
            pipeline: [
              {
                $match: {
                  is_del: false,
                  $expr: { $eq: ["$$sid", "$sid"] }
                }
              },
              {
                $count: "count"
              }
            ]
          }
        },
        {
          $unwind: "$items"
        }
      ]
    }
  }
])

现在,我需要对结果进行分页。如何在汇总结果中分页?什么是可扩展的方法?

标签: mongodbmongodb-query

解决方案


我相信你必须添加

{
    $limit: limit
}, {
    $skip: skip
}

{
    $unwind: "$items"
}

基本上,在您希望将查询限制到的查询级别上,假设 10 个元素,但先跳过 5 个元素(您加载第二页的记录,每页 5 个记录)。我相信你每次limit都必须计算。skip


推荐阅读