You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Mongoose在一对多关系中查询每个教程的标签数量

实现方法

你可以通过以下几种方式实现一次查询获取每个教程的标签数量:

方法一:使用聚合框架(推荐,数据库层面计算)

利用MongoDB的聚合管道,通过$size操作符直接计算tags数组的长度,并添加新字段返回:

const result = await _tutorialModel.aggregate([
  {
    $addFields: {
      tagCount: { $size: "$tags" }
    }
  }
]);

返回的每个教程文档会新增tagCount字段,值为对应教程的标签数量。

方法二:统计实际存在的标签数量(排除已删除的标签)

如果需要确保统计的是数据库中真实存在的Tag(避免tags数组里存储了已被删除的Tag ID),可以先通过$lookup关联Tag集合,再统计有效标签的数量:

const result = await _tutorialModel.aggregate([
  {
    $lookup: {
      from: "tags", // 这里填Tag模型对应的集合名,通常是小写复数形式
      localField: "tags",
      foreignField: "_id",
      as: "existingTags"
    }
  },
  {
    $addFields: {
      tagCount: { $size: "$existingTags" }
    }
  },
  // 可选:移除临时的existingTags字段,只保留需要的数据
  {
    $project: {
      existingTags: 0
    }
  }
]);

方法三:客户端计算(简单但效率较低)

如果数据量不大,也可以先用find查询所有教程,再在客户端计算每个教程的标签数量:

const tutorials = await _tutorialModel.find();
const result = tutorials.map(tutorial => ({
  ...tutorial.toObject(),
  tagCount: tutorial.tags.length
}));

这种方式无需修改查询逻辑,但会将所有标签ID数据传输到客户端后再计算,数据量大时性能不如聚合方法。

内容的提问来源于stack exchange,提问作者Ghasem Khalili

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 06:45:56