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 操作符进行关联查询。下面是一个例子:
// www.javascriptcn.com code example
Model.aggregate([
{
$lookup: {
from: 'other_collection',
localField: 'field1',
foreignField: 'field2',
as: 'other'
}
},
{
$group: {
_id: '$field1',
other_count: { $sum: { $size: '$other' } }
}
}
])在上面的例子中,我们使用 $lookup 操作符将当前集合和另一个集合进行关联查询,然后按照 field1 字段进行分组统计。
示例代码
下面是一个完整的示例代码,用于演示 Group by 操作的基本用法:
// www.javascriptcn.com code example
const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost/test')
const schema = new mongoose.Schema({
field1: String,
field2: String
})
const Model = mongoose.model('Model', schema)
async function main() {
await Model.create([
{ field1: 'a', field2: 'x' },
{ field1: 'a', field2: 'y' },
{ field1: 'b', field2: 'z' },
{ field1: 'b', field2: 'z' },
{ field1: 'c', field2: 'x' }
])
const result = await Model.aggregate([
{ $group: { _id: '$field1', count: { $sum: 1 } } }
])
console.log(result)
}
main()在上面的示例中,我们创建了一个名为 Model 的模型,然后向其中插入了 5 条数据。接着,我们使用 $group 操作符按照 field1 字段进行分组统计,最后将结果输出到控制台上。
Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/67da510ba941bf713423e085