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
相关产品推荐
相关产品推荐

