聚合
概述
在本指南中,您可以了解如何在MongoDB Node.js驱动程序中使用聚合操作。
聚合操作是您可以使用它们在MongoDB中生成减少和汇总结果的表达式。MongoDB的聚合框架允许您创建一个管道,该管道由一个或多个阶段组成,每个阶段都对您的数据进行特定操作。
类比
您可以想象聚合管道类似于一个汽车工厂。汽车制造需要使用组织成装配线的装配站。每个站都有专业工具,如钻床和焊接机。工厂将初始零件和材料转换为成品。
聚合管道是装配线,聚合阶段是装配站,而表达式运算符是专业工具。
比较聚合和查询操作
使用查询操作,如find()
方法,您可以执行以下操作
选择要返回的 文档
选择要返回的 字段
对结果进行排序
使用聚合操作,您可以执行以下操作
执行所有查询操作
重命名字段
计算字段
汇总数据
分组值
聚合操作有一些限制:
返回的文档不得违反 16 兆字节的 BSON 文档大小限制。
默认情况下,管道阶段具有 100 兆字节的内存限制。您可以通过将
AggregateOptions
的allowDiskUse
属性设置为true
来超出此限制。有关更多详细信息,请参阅 AggregateOptions API 文档。
参考资料
要查看表达式运算符的完整列表,请参阅服务器手册中的 聚合运算符。
了解如何构建聚合管道和查看示例,请参阅服务器手册中的聚合管道,链接为Aggregation Pipeline。
要了解有关创建管道阶段的更多信息,请参阅服务器手册中的聚合阶段。
可运行示例
本例使用关于餐厅的样本数据。以下代码将数据插入到聚合数据库中restaurants
集合。
const db = client.db("aggregation"); const coll = db.collection("restaurants"); // Create sample documents const docs = [ { stars: 3, categories: ["Bakery", "Sandwiches"], name: "Rising Sun Bakery" }, { stars: 4, categories: ["Bakery", "Cafe", "Bar"], name: "Cafe au Late" }, { stars: 5, categories: ["Coffee", "Bakery"], name: "Liz's Coffee Bar" }, { stars: 3, categories: ["Steak", "Seafood"], name: "Oak Steakhouse" }, { stars: 4, categories: ["Bakery", "Dessert"], name: "Petit Cookie" }, ]; // Insert documents into the restaurants collection const result = await coll.insertMany(docs);
提示
有关连接到您的MongoDB部署的更多信息,请参阅连接指南.
聚合示例
要执行聚合,请将聚合阶段列表传递给collection.aggregate()
方法。
在本例中,聚合管道使用了以下聚合阶段
// Define an aggregation pipeline with a match stage and a group stage const pipeline = [ { $match: { categories: "Bakery" } }, { $group: { _id: "$stars", count: { $sum: 1 } } } ]; // Execute the aggregation const aggCursor = coll.aggregate(pipeline); // Print the aggregated results for await (const doc of aggCursor) { console.log(doc); }
本例产生以下输出
{ _id: 4, count: 2 } { _id: 3, count: 1 } { _id: 5, count: 1 }
更多信息,请参阅 aggregate() API 文档。
其他示例
要查看常见聚合任务的逐步解释,请参阅 聚合教程。
您可以在 MongoDB 网站上的博客文章中找到另一个聚合管道示例:[使用聚合框架分析数据的 Node.js 教程](https://mongodb.ac.cn/blog/post/quick-start-nodejs--mongodb--how-to-analyze-data-using-the-aggregation-framework)。