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

MongoDB按status统计各状态出现次数的代码问题求助

问题排查与解决

你的聚合查询逻辑本身是正确的,无法得到预期结果的核心问题是没有将聚合游标转换为实际数据,另外还有几个需要注意的细节:

1. 核心问题:聚合游标未转换

MongoDB的aggregate()方法返回的是AggregationCursor对象,不是直接的结果集,必须调用toArray()方法才能获取最终的统计数据:

修改结果获取的代码行:

let result = await collection.aggregate([...]).toArray();

此时返回的是包含目标对象的数组,打印时取数组第一个元素即可得到你想要的格式:

console.log("result => ", result[0]);

2. 其他注意事项

  • 替换代码中的"database name here"和"collection name here"为你实际使用的数据库名和集合名
  • 你提供的示例文档结构缺少逗号(比如"id": "1"后需加,),这只是示例笔误,实际MongoDB文档需保证语法正确

修正后的完整代码

const mongoClient = require('mongodb').MongoClient;

const test = async () => {
    const mongoUri = "mongodb://localhost:27017/";
    
    const dbClientConnection = await mongoClient.connect(mongoUri, {
        useNewUrlParser: true,
        useUnifiedTopology: true
    });

    const db = await dbClientConnection.db("your-db-name");
    const collection = await db.collection("your-collection-name");

    let result = await collection.aggregate([
    {
      $group: {
        _id: "$status",
        sum: { $sum: 1 }
      }
    },
    {
      $group: {
        _id: null,
        status: {
          $push: { k: "$_id", v: "$sum" }
        }
      }
    },
    {
      $replaceRoot: {
        newRoot: { $arrayToObject: "$status" }
      }
    }
    ]).toArray(); // 新增toArray()转换游标

    console.log("result => ", result[0]); // 取数组第一个元素

    dbClientConnection.close(); // 记得关闭数据库连接
    return result[0];
}

test();

简化方案(可选)

如果不需要严格的键值对格式,也可以用更简洁的方式直接获取分组统计结果:

let result = await collection.aggregate([
  { $group: { _id: "$status", count: { $sum: 1 } } }
]).toArray();
// 输出格式:[{ _id: "active", count: 2 }, { _id: "in-active", count: 1 }, ...]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 05:55:16