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

写作开发人员

我有这样的页面。数据来自我的MongoDB服务器。

在此处输入图片说明

首先,我创建用户集合并放置这些用户数据。但是我添加了Counter集合,因为我想显示其View Count

每个用户都有多个页面,并且“查看计数”数据是“计数器”数据的总和。

用户集合看起来像这样,我只需要登录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": "[email protected]",
    "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
}

在“计数器”集合中,我仅需要userName,count字段来计算计数器数据。

所以我尝试使用循环和聚合方法,但问题是用户数据太多,因此我不得不向服务器发送太多查询。(如果我有10000个用户数据,则必须发送10000个请求)因此,我一定不能使用for循环方法。

router.get(`/sitemap/0`, async (req, res, next) => {
  let name;
  let dataArray = [];
  let pageNumber = (Number(req.params.page) * 10000); // Current Page Number
  let nextPage = (Number(req.params.page) + 1) * 10000; // Next Page Number
  let pageResult; // Page Result
  try {
    let users = await User.find({}, 'login id').limit(1000)
    for (let i = 0; i < 1000; i++) {
      name = users[i].login
      let counters = await Counter.aggregate([{
          $match: {
            id: users.id,
            userName: users[i].login
          }
        },
        {
          $group: {
            _id: `${users[i].login}`,
            count: {
              $sum: "$count"
            }
          }
        }
      ])
      dataArray.push(counters)
      console.log(counters)
    }
    console.log(dataArray)

  } catch (e) {
    // throw an error
    throw e;
  }
  res.render("sitemap", {
    dataArray
  })
});

代码结果

在此处输入图片说明

因此,我想发送单个查询,我认为应该使用“聚合”方法。但是没有“ for循环”。

我想加入Users collectionCounters collection但听说MongoDB和Mongoose中没有加入功能。

我只想要这样的结果。反正有这样的办法吗?

{
    "_id": {
        "$oid": "5f7e92b88dc8f64cb4e6c2c0"
    },
    "login": "mojombo", --------------Match login with counter collection 'userName' value
    "id": 1,  ------------------------Match id with counter collection 'id' value
    "count": [Sum of counters count data and it should be Number] ------- Only this field is added
    "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": "[email protected]",
    "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
}
土生的
  • $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 }
])

操场

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

两个 Document 属性中的一个未插入到 mongoDB 集合中,使用:Mongoose 和 Express

来自分类Dev

如何使用pdo在一个查询中对两个值进行rowCount?

来自分类Dev

节点,MongoDB,Mongoose设计选择-创建两个集合或一个集合

来自分类Dev

节点,MongoDB,Mongoose设计选择-创建两个集合或一个集合

来自分类Dev

MongoDB对两个集合进行查询,以在第一个集合中添加/减去一个字段,并与第二个集合中的匹配字段相加

来自分类Dev

从MongoDB中的两个集合查询

来自分类Dev

使用两个集合的MongoDB查询

来自分类Dev

如何在MongoDB中查询两个集合的想法

来自分类Dev

在 mongodb 中的另一个集合的 foreignField 上使用 $group 进行分组

来自分类Dev

如何使用Iterator迭代一个集合中的两个元素?

来自分类Dev

如何使用 lambda 函数在 mongodb 中的两个集合之间进行多个连接?

来自分类Dev

一个查询中有两个mongodb集合

来自分类Dev

如何遍历两个分组查询以在一个月度表中同时显示两个查询

来自分类Dev

如何使用php在一个mysql查询中运行两个循环

来自分类Dev

如何使用一个SQL查询从两个表中获得结果?

来自分类Dev

对不同集合的两个查询-MongoDB

来自分类Dev

MongoDB:填充或查询两个集合

来自分类Dev

mongodb-从集合中的两个数组中获取一个数组

来自分类Dev

如何在PHP代码中将两个表中的两个查询合并为一个查询?

来自分类Dev

如何使用Mongoose更新MongoDB中的一个属性?

来自分类Dev

如何在SQL Server 2008中的单个查询中进行两个分组

来自分类Dev

在一个查询中按不同属性对两个模型进行排序

来自分类Dev

SQL:选择两个不同的内容并在一个查询中对结果进行计算

来自分类Dev

在一个查询中按不同属性对两个模型进行排序

来自分类Dev

Laravel 如何从两个分离的集合中创建一个对象?

来自分类Dev

使用一个模型发送两个LINQ查询以进行查看

来自分类Dev

如何使用Spring Mongo对两个字段进行分组并根据另一个字段获得一个数组?

来自分类Dev

在一个查询中从具有两个外键的一个表中进行选择

来自分类Dev

如何从两个集合中查找查询

Related 相关文章

  1. 1

    两个 Document 属性中的一个未插入到 mongoDB 集合中,使用:Mongoose 和 Express

  2. 2

    如何使用pdo在一个查询中对两个值进行rowCount?

  3. 3

    节点,MongoDB,Mongoose设计选择-创建两个集合或一个集合

  4. 4

    节点,MongoDB,Mongoose设计选择-创建两个集合或一个集合

  5. 5

    MongoDB对两个集合进行查询,以在第一个集合中添加/减去一个字段,并与第二个集合中的匹配字段相加

  6. 6

    从MongoDB中的两个集合查询

  7. 7

    使用两个集合的MongoDB查询

  8. 8

    如何在MongoDB中查询两个集合的想法

  9. 9

    在 mongodb 中的另一个集合的 foreignField 上使用 $group 进行分组

  10. 10

    如何使用Iterator迭代一个集合中的两个元素?

  11. 11

    如何使用 lambda 函数在 mongodb 中的两个集合之间进行多个连接?

  12. 12

    一个查询中有两个mongodb集合

  13. 13

    如何遍历两个分组查询以在一个月度表中同时显示两个查询

  14. 14

    如何使用php在一个mysql查询中运行两个循环

  15. 15

    如何使用一个SQL查询从两个表中获得结果?

  16. 16

    对不同集合的两个查询-MongoDB

  17. 17

    MongoDB:填充或查询两个集合

  18. 18

    mongodb-从集合中的两个数组中获取一个数组

  19. 19

    如何在PHP代码中将两个表中的两个查询合并为一个查询?

  20. 20

    如何使用Mongoose更新MongoDB中的一个属性?

  21. 21

    如何在SQL Server 2008中的单个查询中进行两个分组

  22. 22

    在一个查询中按不同属性对两个模型进行排序

  23. 23

    SQL:选择两个不同的内容并在一个查询中对结果进行计算

  24. 24

    在一个查询中按不同属性对两个模型进行排序

  25. 25

    Laravel 如何从两个分离的集合中创建一个对象?

  26. 26

    使用一个模型发送两个LINQ查询以进行查看

  27. 27

    如何使用Spring Mongo对两个字段进行分组并根据另一个字段获得一个数组?

  28. 28

    在一个查询中从具有两个外键的一个表中进行选择

  29. 29

    如何从两个集合中查找查询

热门标签

归档