在 MongoDB 中,聚合操作用于处理和分析文档数据集合,例如计算平均值、求和、计数、排序、分组等。在本文中,我们将学习如何使用 Mongoose 库来进行 MongoDB 的聚合操作。
Mongoose 简介
Mongoose 是一个 Node.js 在 MongoDB 上操作的对象模型库,可以提供可插入的数据验证、查询构建、业务逻辑钩子等功能。
在使用 Mongoose 前,请确保已经安装了 Node.js 环境和 MongoDB 数据库。
聚合操作
Mongoose 支持 MongoDB 各种聚合操作,包括以下内容:
- $match:筛选文档;
- $group:按照特定字段完成文档分组;
- $sort:对满足条件的文档进行排序;
- $skip 和 $limit:用于进行文档的分页操作;
- $count:统计文档数量;
- $project:提取文档的部分内容;
- $unwind:将数组字段拆分为多个文档。
接下来,我们将深入学习如何使用 Mongoose 库执行这些聚合操作。
示例代码
考虑一个示例数据库,包含 users
集合,文档格式如下:
{ "_id": "5da397995a28bb002f2d2a8e", "name": "小明", "age": 20, "gender": "男", "hobbies": [ "reading", "swimming" ], "updated_at": "2019-10-14T07:16:09.283Z" }
$match 操作
我们可以使用 aggregate
函数和 $match
操作符来筛选文档,例如,在查询所有年龄大于等于 18 的用户时,可以使用以下代码:
const users = await UserModel.aggregate([ { $match: { age: { $gte: 18 } } } ]);
其中,UserModel
是 Mongoose 模型对象,$match
操作符用于筛选年龄大于等于 18 的用户,返回查询结果。
$group 操作
使用 aggregate
函数和 $group
操作符来按照特定字段完成文档分组。
例如,在查询所有年龄大于等于 20 的用户中,性别为男性和女性的数量时,可以使用以下代码段:
const result = await UserModel.aggregate([ { $match: { age: { $gte: 20 } } }, { $group: { _id: "$gender", count: { $sum: 1 } } } ]);
其中,$match
操作符用于筛选年龄大于等于 20 的用户,$group
操作符按照 gender
字段进行文档分组,输出 gender
字段和每个分组的数量。
$sort 操作
使用 aggregate
函数和 $sort
操作符对满足条件的文档进行排序。
例如,在查询所有用户中,按照年龄从大到小的顺序排序,可以使用以下代码段:
const result = await UserModel.aggregate([ { $sort: { age: -1 } } ]);
其中,$sort
操作符按照 age
字段进行文档排序,-1
表示降序排列。
$skip 和 $limit 操作
使用 aggregate
函数和 $skip
和 $limit
操作符用于进行分页操作。
例如,在查询所有用户中,返回第 10 到 20 条文档,可以使用以下代码段:
const result = await UserModel.aggregate([ { $skip: 10 }, { $limit: 10 } ]);
其中,$skip
操作符用于跳过前 10 条文档,$limit
操作符用于输出 10 条文档。
$count 操作
使用 aggregate
函数和 $count
操作符统计文档数量。
例如,在查询所有年龄大于等于 20 的用户数量,可以使用以下代码段:
const result = await UserModel.aggregate([ { $match: { age: { $gte: 20 } } }, { $count: "count" } ]);
其中,$match
操作符用于筛选年龄大于等于 20 的文档,$count
操作符输出文档数量。
$project 操作
使用 aggregate
函数和 $project
操作符提取文档的部分内容。
例如,在查询所有用户中,仅返回 name
和 age
字段,可以使用以下代码段:
const result = await UserModel.aggregate([ { $project: { name: 1, age: 1 } } ]);
其中,$project
操作符用于输出文档中的 name
和 age
字段。
$unwind 操作
使用 aggregate
函数和 $unwind
操作符将数组字段拆分为多个文档。
例如,在查询所有用户中,将 hobbies
字段拆分为多个文档,可以使用以下代码段:
const result = await UserModel.aggregate([ { $unwind: "$hobbies" } ]);
其中,$unwind
操作符用于将数组字段 hobbies
拆分为多个文档,并输出。
总结
Mongoose 库是一个强大的 Node.js 对象模型库,可以提供可插入的数据验证、查询构建、业务逻辑钩子等功能,使得 MongoDB 的聚合操作更加方便和灵活。
在使用 Mongoose 执行聚合操作时,请始终遵循最佳实践并进行适当的异常处理。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6592234ceb4cecbf2d709c65