在开发 web 应用程序中,数据处理是不可避免的。在处理数据时,我们需要经常进行聚合操作。Mongoose 是 Node.js 最流行的 ORM 库之一,它提供了聚合操作的功能。本文将介绍 Mongoose 中如何使用 aggregate 方法进行聚合操作。
聚合操作概述
在 MongoDB 中,聚合操作是一种处理数据的方法,可以通过一系列阶段操作原始数据,生成聚合数据。在 Mongoose 中,聚合操作的核心是 aggregate 方法,它接收一个数组作为参数,每个元素表示一个聚合阶段。聚合阶段可以是 MongoDB 聚合管道中的任何操作。
aggregate 方法基础用法
在 Mongoose 中,我们可以调用模型的 aggregate 方法进行聚合操作:
const result = await MyModel.aggregate(pipeline);
其中,pipeline 是聚合阶段数组,返回的是聚合结果。我们可以通过一个简单的示例了解 aggregate 方法的基本用法。
假设我们有一个 MyModel 的模型,它有以下字段:
const MySchema = new Schema({ name: String, age: Number, city: String, }); const MyModel = mongoose.model('MyModel', MySchema);
现在我们想要按城市分组,求出每个城市的平均年龄,可以这样写:
const result = await MyModel.aggregate([ { $group: { _id: '$city', avgAge: { $avg: '$age' } } }, ]);
这个聚合阶段数组只有一个元素,它表示一个聚合阶段,使用了 MongoDB 的聚合管道中的 $group 操作。$group 操作指定了按 city 字段分组,并求出每组中 age 字段的平均值,最终返回 _id 和 avgAge 两个字段。
使用 $match 过滤数据
在聚合操作中,我们经常需要使用 $match 过滤数据。$match 操作可以根据条件筛选出符合条件的数据,然后进入聚合管道。我们可以将 $match 和 $group 组合使用,求出符合条件的数据的平均值。
const result = await MyModel.aggregate([ { $match: { city: 'Shanghai' } }, { $group: { _id: '$city', avgAge: { $avg: '$age' } } }, ]);
这个聚合阶段数组有两个元素,第一个元素表示 $match 操作,它只选择城市为 Shanghai 的数据,第二个元素表示 $group 操作,对符合条件的数据进行分组求平均值操作。
使用 $project 修改返回字段
在聚合操作中,我们经常需要选择返回的字段和更改返回的字段名。$project 操作可以修改返回的字段名和选择返回的字段。我们可以将 $project 和 $group 组合使用,修改返回的字段名,然后对数据进行聚合操作。
const result = await MyModel.aggregate([ { $match: { city: 'Shanghai' } }, { $group: { _id: '$city', avgAge: { $avg: '$age' } } }, { $project: { city: '$_id', avgAge: 1, _id: 0 } }, ]);
这个聚合阶段数组有三个元素,第一个元素表示 $match 操作,第二个元素表示 $group 操作,第三个元素表示 $project 操作,它将返回的 _id 字段改为 city,并将 _id 字段从返回值中删除。
使用 $lookup 进行数据关联
在聚合操作中,我们经常需要进行数据关联操作。$lookup 操作可以连接两个集合,并将他们的数据合并到一起。我们可以将 $lookup 和 $unwind 组合使用,将两个集合数据合并,然后对合并后的数据进行聚合操作。
-- -------------------- ---- ------- ----- ---------- - --- -------- ----- ------- ---- ------- --- ----- ----------- - --- -------- ----- ------------------------------- ------- ------- --- ----- --------- - --------------------------- ------------ ----- ---------- - ---------------------------- ------------- ----- ------ - ----- ---------------------- - -------- - ----- -------- ----------- ------- ------------- ------ --- ----------- -- -- - -------- ----------- -- - ------- - ---- ----------------- ------------ - ----- --------- - - -- ---
这个示例中,我们有两个模型:UserModel 和 OrderModel。OrderModel 包含一个 user 字段,表示关联 UserModel 中的一个记录。我们使用 $lookup 操作将 OrderModel 和 UserModel 关联起来,然后使用 $unwind 操作将结果展开。最后对展开后的数据进行聚合操作,计算每个 user 的 totalAmount。
总结
Mongoose 中的 aggregate 方法是处理数据的重要工具,在聚合操作中,我们可以使用多个聚合阶段,通过 MongoDB 聚合管道中的操作连续处理数据,并最终生成聚合结果。在实际开发中,我们需要灵活运用聚合操作,根据需求组合多个操作,达到最佳效果。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/647469d8968c7c53b01ca1ed