猿问

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

我有这样的页面。数据来自我的 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 循环方法。


人到中年有点甜
浏览 128回答 1
1回答

RISEBY

$lookup使用管道阶段的计数器集合,让传递 2 个字段id, login以匹配计数器集合$match两个字段条件$addFieldscount从计数器数组中求和计数字段,使用迭代$reduce循环和$add求和计数字段的值$skip用于分页$limit超过你的文件限制let page = 1; // start pagination from firstlet 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 }])操场
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答