在MongoDB中,查询数据主要包括基础查询以及使用聚合框架(Aggregation Framework)进行复杂数据处理。
基础查询操作
1. find()
查询:
-
db.collection.find(query, projection)
是最基本的查询方法,其中:-
query
是一个JSON形式的对象,定义了要匹配的文档条件。 -
projection
可选,用于指定返回文档中包含哪些字段,可以用来做字段筛选和投影操作。
-
示例:
db.users.find({ age: { $gt: 18 } }); // 查询年龄大于18的所有用户
db.users.find({ gender: 'male' }, { name: 1, email: 1 }); // 查询性别为男性的用户,并仅返回姓名和邮箱字段
2. 查询条件:
- 使用各种查询操作符如
$gt
,$gte
,$lt
,$lte
,$ne
,$in
,$nin
,$exists
,$regex
等来进行特定条件的匹配。
3. 排序(Sort):
- 使用
sort()
方法对查询结果进行排序,例如:
db.users.find().sort({ age: 1, name: -1 }); // 按照年龄升序、姓名降序排列结果
4. 限制查询结果的数量(Limit & Skip):
-
limit()
方法用于限制返回的结果数量,而skip()
方法则是跳过指定数量的文档再返回结果。
db.users.find().sort({ registrationDate: -1 }).limit(10); // 获取最新注册的前10个用户
db.users.find().skip(50).limit(10); // 跳过前50个文档,然后获取接下来的10个文档
聚合框架(Aggregation Pipeline)
MongoDB的聚合框架允许用户执行多个阶段的处理,将数据从原始集合转换成单一输出结果。每个阶段都会处理文档流,并将其传递给下一个阶段。
-
常见操作符:
-
$match
: 类似于find()
的查询过滤阶段。 -
$project
: 改变输入文档的结构或内容,类似于find()
的投影阶段。 -
$group
: 将文档按某个字段分组,并计算每个组的统计值,如总和、平均值等。 -
$sort
: 对中间结果进行排序。 -
$skip
和$limit
: 在聚合管道中也可以使用来控制输出文档的数量和起始位置。 -
$unwind
: 将数组类型的字段拆分成多条文档。 -
$lookup
: 进行类似JOIN的操作,从其他集合中加入相关文档。 -
$merge
: 合并聚合结果到另一个集合。 - 更多操作符如
$addFields
,$bucket
,$bucketAuto
,$count
,$facet
,$replaceRoot
,$sample
等,提供丰富的数据处理能力。
-
聚合操作示例:
db.orders.aggregate([
{ $match: { status: "completed" } },
{ $group: { _id: "$customer_id", totalSpent: { $sum: "$amount" } } },
{ $sort: { totalSpent: -1 } },
{ $limit: 10 }
]);
这个聚合操作会找到所有已完成状态的订单,按客户ID分组计算每位客户的总消费额,并返回消费额最高的前10名客户。