You need to enable JavaScript to run this app. 如何在MongoDB中按指定slug条件统计likes数组的元素数量
优惠活动
大模型
产品
解决方案
定价
更多

如何在MongoDB中按指定slug条件统计likes数组的元素数量

错误原因

原代码存在3个核心问题:

  • 聚合管道要求每个阶段必须以操作符开头,原代码直接将过滤条件作为第一个参数,没有包裹在$match阶段中,不符合聚合语法要求
  • 引用文档字段时需要加$前缀,原代码中$size:"likes"写法错误,无法正确读取likes字段
  • 末尾的.count()是统计聚合返回的文档数量,不是统计数组的元素个数,完全不符合需求
  • 额外兼容问题:如果文档没有likes字段,$size会直接抛出异常,需要做空值兼容
正确实现

方案1:聚合管道实现

如果必须使用聚合管道,正确写法如下:

db.blog.aggregate([
  // 过滤指定slug的文档
  { $match: { slug: "slugxyz" } },
  // 计算likes数组长度,无此字段默认返回0
  {
    $project: {
      _id: 0,
      NumberOfItemsInArray: {
        $size: { $ifNull: ["$likes", []] }
      }
    }
  }
])

执行后会直接返回包含NumberOfItemsInArray字段的结果,该值就是目标文档的likes数组元素个数。

方案2:更简洁的findOne实现

因为slug是唯一值,不需要使用聚合,直接查询单条文档处理性能更高:

// 只查询需要的likes字段,减少IO开销
const targetDoc = db.blog.findOne({ slug: "slugxyz" }, { likes: 1, _id: 0 });
const likesCount = targetDoc?.likes ? targetDoc.likes.length : 0;

直接打印likesCount即可得到统计结果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 23:54:05