在 MongoDB 中,使用 $group 操作符可以实现对数据进行分组统计的功能。在 Mongoose 中,也提供了 $group 操作符的支持,可以方便地进行数据分组统计。
$group 操作符的语法
在 Mongoose 中,使用 $group 操作符的语法如下:
Model.aggregate([ { $group: { _id: <expression>, <field1>: { <accumulator1> : <expression1> }, ... } }, ... ]);
其中:
_id
:分组的依据,可以是一个字段,也可以是一个表达式。如果是一个字段,系统会按该字段的值进行分组;如果是一个表达式,系统会按照表达式的计算结果进行分组。可以使用任何有效的表达式,包括算术运算符、逻辑运算符和比较运算符等。<field>
:每个属性都是一个计算后的值。可以使用 MongoDB 的累加器操作来计算这些值,例如 $sum、$avg、$min、$max、$first 和 $last 等。<expression>
:每个属性都是使用聚合表达式计算出的值,这些值可以由 MongoDB 的表达式来计算,例如 $sum、$avg、$min、$max、$first 和 $last 等。
$group 操作符的示例
下面我们通过一个实际的例子来演示如何使用 $group 操作符进行分组统计。
准备数据
假设我们有一个用户注册信息的集合,包含了每个用户的姓名、年龄、邮箱地址、注册时间等信息。
const userSchema = new mongoose.Schema({ name: { type: String, required: true }, age: { type: Number, required: true }, email: { type: String, required: true }, createdAt: { type: Date, default: Date.now } }); const User = mongoose.model('User', userSchema);
我们向集合中插入一些示例数据:
const user1 = new User({ name: '张三', age: 18, email: 'zhangsan@example.com' }); const user2 = new User({ name: '李四', age: 20, email: 'lisi@example.com' }); const user3 = new User({ name: '王五', age: 22, email: 'wangwu@example.com' }); await User.insertMany([user1, user2, user3]);
统计每个年龄段的用户数量
现在我们要统计每个年龄段的用户数量,可以使用以下代码:
-- -------------------- ---- ------- ----- ------ - ----- ---------------- - ------- - ---- - -------- - --------- - - ----- - ---- -------- --- -- ----- ------- -- - ----- - ---- -------- --- -- ----- --------- -- - ----- - ---- -------- --- -- ----- --------- - -- -------- -------- - -- ------ - ----- - - - - --- --------------------
这段代码首先通过 $switch 表达式将每个用户按照年龄分为不同的年龄段。然后使用 $group 操作符对每个年龄段的用户进行分组,并通过 $sum 累加器计算出每个组中用户的数量。最终得到以下输出结果:
[ { _id: '18岁以下', count: 1 }, { _id: '20岁-24岁', count: 1 }, { _id: '25岁-29岁', count: 1 } ]
统计每个年龄段的用户数量和平均年龄
我们还可以使用 $group 操作符来同时统计每个年龄段的用户数量和平均年龄,可以使用以下代码:
-- -------------------- ---- ------- ----- ------ - ----- ---------------- - ------- - ---- - -------- - --------- - - ----- - ---- -------- --- -- ----- ------- -- - ----- - ---- -------- --- -- ----- --------- -- - ----- - ---- -------- --- -- ----- --------- - -- -------- -------- - -- ------ - ----- - -- ------- - ----- ------ - - - --- --------------------
这里增加了一个 avgAge 属性,将平均年龄也纳入了统计范畴,最终得到以下输出结果:
[ { _id: '18岁以下', count: 1, avgAge: 18 }, { _id: '20岁-24岁', count: 1, avgAge: 20 }, { _id: '25岁-29岁', count: 1, avgAge: 22 } ]
总结
$group 操作符是 MongoDB 中用于实现数据分组统计的关键操作符之一,也是 Mongoose 中的核心操作符之一。通过合理地使用 $group 操作符,可以轻松实现对数据的分组统计,为数据分析和业务决策提供有力的支持。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64e02c38f6b2d6eab3b410bc