为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 MongoDB 或 Mongoose 在一个查询中对两个集合进行分组

如何使用 MongoDB 或 Mongoose 在一个查询中对两个集合进行分组

人到中年有点甜 2023-06-09 15:18:04
我有这样的页面。数据来自我的 MongoDB 服务器。首先,我创建用户集合并放置这些用户数据。但我添加了Counter 集合,因为我想显示他们的View Count。每个用户有多个页面,View Count数据是Counter数据的总和。用户集合看起来像这样,我只需要登录名、id(唯一)数据。用户收藏{    "_id": {        "$oid": "5f7e92b88dc8f64cb4e6c2c0"    },    "login": "mojombo",    "id": 1,    "avatar_url": "https://avatars0.githubusercontent.com/u/1?v=4",    "url": "https://api.github.com/users/mojombo",    "html_url": "https://github.com/mojombo",    "type": "User",    "site_admin": "false",    "name": "Tom Preston-Werner",    "company": null,    "blog": "http://tom.preston-werner.com",    "location": "San Francisco",    "email": "tom@mojombo.com",    "hireable": null,    "bio": null,    "created_at": {        "$date": "2007-10-20T05:24:19.000Z"    },    "updated_at": {        "$date": "2020-09-22T15:50:44.000Z"    },    "registerDate": {        "$date": "2020-10-08T04:16:56.459Z"    },    "__v": 0}专柜收款{    "_id": {        "$oid": "5f8e5bde9054ba2477dc2c57"    },    "repoName": "ale",    "repoNumber": 171780764,    "userName": "technicalpickles",    "userNumber": 159,    "viewDate": "2020-10-20",    "count": 1}在 Counters 集合中,我只需要userName,count字段来计算计数器数据。所以我尝试循环和聚合方法,但问题是用户数据太多,所以我必须向服务器发送太多查询。(如果我有 10000 个用户数据,我必须发送 10000 个请求)所以,我不能使用 for 循环方法。
查看完整描述

1 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

  • $lookup使用管道阶段的计数器集合,让传递 2 个字段id, login以匹配计数器集合

  • $match两个字段条件

  • $addFieldscount从计数器数组中求和计数字段,使用迭代$reduce循环和$add求和计数字段的值

  • $skip用于分页

  • $limit超过你的文件限制

let page = 1; // start pagination from first

let limit = 1000;

let skip = (page - 1) * limit;

let users = await User.aggregate([

  {

    $lookup: {

      from: "counters",

      let: {

        id: "$id",

        login: "$login"

      },

      pipeline: [

        {

          $match: {

            $expr: {

              $eq: ["$userName", "$$login"],

              $eq: ["$userNumber", "$$id"]

            }

          }

        }

      ],

      as: "count"

    }

  },

  {

    $addFields: {

      count: {

        $reduce: {

          input: "$count",

          initialValue: 0,

          in: { $add: ["$$value", "$$this.count"] }

        }

      }

    }

  },

  { $skip: skip },

  { $limit: limit }

])

操场


查看完整回答
反对 回复 2023-06-09
  • 1 回答
  • 0 关注
  • 127 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信