关于mongoose关联表统计查询的需求

发布于 2022-09-04 12:58:06 字数 242 浏览 10 评论 0

请教一个关于mongodb(mongoose)的问题,
一个博客,有两张表,文章和tag,多对多关系,
文章表内有tag字段是一个数组,存储着tag的id,查询文章的时候可以关联出每一个tag的数据,
现在的需求是:
查询tag list的时候,需要同时得到每个tag分别被多少个文章包含着,即count,
除了 遍历 和 手动建立count字段增删改时重新统计
是否还有更好的通过mongoose api实现的方法,感谢各位大神!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

手心的海 2022-09-11 12:58:06

解决了,需要聚合查询,聚合前先分解,然后聚合,具体代码,其实本身聚合查询可以查询需求,但是需求是多对多数据关系,而非一对多,所以必须先分解为一对一关系

相关代码片段
相关参考文档

// 查询article-tag的count聚合数据
  const getTagsCount = tags => {
    let $match = {};
    if (!authIsVerified(req)) {
      $match = { state: 1, public: 1 };
    }
    Article.aggregate([
      { $match },
      { $unwind : "$tag" }, 
      { $group: { 
        _id: "$tag", 
        num_tutorial: { $sum : 1 }}
      }
    ])
    .then(counts => {
      const newTags = tags.docs.map(t => {
        const finded = counts.find(c => String(c._id) === String(t._id));
        t.count = finded ? finded.num_tutorial : 0;
        return t;
      });
      tags.docs = newTags;
      querySuccess(tags);
    })
    .catch(err => {
      querySuccess(tags);
    })
  };
橘和柠 2022-09-11 12:58:06

mongoose 里面有一个叫 Population 这个非常好用建议去了解一下

等待我真够勒 2022-09-11 12:58:06

可以用$lookup


let tagList = await tagModel.aggregate([
    {
      $lookup: {
        from: 'articles',
        localField: '_id',
        foreignField: 'tag',
        as: 'articleList'
      }
    }
  ]);
  res.json(tagList);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文