Mongoose 是一个优秀的 Node.js ORM 框架,它提供了一套强大的 API,用于操作 MongoDB 数据库。在实际应用中,我们经常需要进行一些聚合操作,比如分组统计、求和、平均值等。本文将介绍 Mongoose 中的 Group by 操作技巧和最佳实践。
Group by 操作的基本语法
在 Mongoose 中,我们可以使用 aggregate 方法进行聚合操作。其中,$group 操作符用于对数据进行分组统计。下面是 $group 操作符的基本语法:
Model.aggregate([
{ $group: { _id: "$field", count: { $sum: 1 } } }
])在上面的语法中,_id 字段指定了分组的依据,$sum 操作符用于统计数量。这个语句的含义是:按照 field 字段进行分组,统计每组的数量。
Group by 操作的高级用法
除了基本语法外,Mongoose 中的 Group by 操作还支持一些高级用法。下面将介绍其中的几种。
多个字段进行分组
在实际应用中,我们可能需要按照多个字段进行分组统计。这时,可以在 $group 操作符中使用多个字段,用逗号隔开。下面是一个例子:
Model.aggregate([
{ $group: { _id: { field1: "$field1", field2: "$field2" }, count: { $sum: 1 } } }
])在上面的语句中,我们按照 field1 和 field2 两个字段进行分组统计。
对分组后的数据进行筛选
在分组统计后,我们可能需要对数据进行筛选,只保留满足条件的数据。这时,可以在 $match 操作符中指定筛选条件。下面是一个例子:
Model.aggregate([
{ $group: { _id: "$field", count: { $sum: 1 } } },
{ $match: { count: { $gt: 10 } } }
])在上面的语句中,我们先按照 field 字段进行分组统计,然后筛选出数量大于 10 的数据。
对分组后的数据进行排序
在分组统计后,我们可能需要对数据进行排序,以便更好地展示结果。这时,可以在 $sort 操作符中指定排序方式。下面是一个例子:
Model.aggregate([
{ $group: { _id: "$field", count: { $sum: 1 } } },
{ $sort: { count: -1 } }
])在上面的语句中,我们先按照 field 字段进行分组统计,然后按照数量降序排序。
Group by 操作的最佳实践
在实际应用中,我们需要注意一些 Group by 操作的最佳实践。下面将介绍其中的几个。
建立索引
在进行 Group by 操作时,建立索引可以大大提高查询效率。建立索引可以在模型定义时指定,也可以在运行时通过 createIndex 方法创建。下面是一个例子:
const schema = new mongoose.Schema({
field1: String,
field2: String
})
schema.index({ field1: 1, field2: 1 })
const Model = mongoose.model('Model', schema)在上面的例子中,我们对 field1 和 field2 字段建立了联合索引。
使用 $lookup 操作符进行关联查询
在进行 Group by 操作时,我们可能需要对多个集合进行关联查询。这时,可以使用 $lookup 操作符进行关联查询。下面是一个例子:
-- -------------------- ---- -------
-----------------
-
-------- -
----- -------------------
----------- ---------
------------- ---------
--- -------
-
--
-
------- -
---- ----------
------------ - ----- - ------ -------- - -
-
-
--在上面的例子中,我们使用 $lookup 操作符将当前集合和另一个集合进行关联查询,然后按照 field1 字段进行分组统计。
示例代码
下面是一个完整的示例代码,用于演示 Group by 操作的基本用法:
-- -------------------- ---- -------
----- -------- - -------------------
--------------------------------------------
----- ------ - --- -----------------
------- -------
------- ------
--
----- ----- - ----------------------- -------
----- -------- ------ -
----- --------------
- ------- ---- ------- --- --
- ------- ---- ------- --- --
- ------- ---- ------- --- --
- ------- ---- ------- --- --
- ------- ---- ------- --- -
--
----- ------ - ----- -----------------
- ------- - ---- ---------- ------ - ----- - - - -
--
-------------------
-
------在上面的示例中,我们创建了一个名为 Model 的模型,然后向其中插入了 5 条数据。接着,我们使用 $group 操作符按照 field1 字段进行分组统计,最后将结果输出到控制台上。
Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/67da510ba941bf713423e085