MongoDB 之 aggregate 基本用法


前言

在 MongoDB 里,aggregate 方法是一个强大的工具,用于对集合中的文档进行聚合处理,它可以执行筛选、分组、排序、计算等一系列操作。以下是对其 API 详细使用的介绍:

基本语法

db.collection.aggregate(pipeline, options);
  • collection:代表要进行聚合操作的集合名称。
  • pipeline:是一个由多个聚合阶段(stage)组成的数组,每个阶段会按照顺序依次对文档进行处理。
  • options(可选):是一个包含聚合操作选项的文档,例如 allowDiskUse 允许在聚合过程中使用磁盘空间来处理大量数据。

常见聚合阶段及示例

1. $match 阶段

此阶段用于筛选文档,只有符合指定条件的文档才会进入下一个阶段。

// 查询 orders 集合中 totalAmount 大于 100 的文档
db.orders.aggregate([
    {
        $match: { totalAmount: { $gt: 100 } }
    }
]);
2. $project 阶段

该阶段用于选择要返回的字段,还能对字段进行重命名、计算等操作。

// 从 users 集合中选择 name 和 age 字段,并将 name 重命名为 fullName
db.users.aggregate([
    {
        $project: {
            fullName: "$name",
            age: 1
        }
    }
]);
3. $group 阶段

这个阶段可将文档按照指定的键进行分组,同时可以对每个组执行聚合操作,像求和、计数等。

// 按 category 字段对 products 集合分组,并统计每个组的文档数量
db.products.aggregate([
    {
        $group: {
            _id: "$category",
            count: { $sum: 1 }
        }
    }
]);
4. $sort 阶段

用于对文档进行排序,1 表示升序,-1 表示降序。

// 对 sales 集合按 totalSales 字段降序排序
db.sales.aggregate([
    {
        $sort: { totalSales: -1 }
    }
]);
5. $limit 阶段

用于限制返回的文档数量。

// 从 customers 集合中返回前 5 个文档
db.customers.aggregate([
    {
        $limit: 5
    }
]);
6. $skip 阶段

该阶段用于跳过指定数量的文档。

// 跳过 customers 集合中的前 3 个文档,返回剩余的文档
db.customers.aggregate([
    {
        $skip: 3
    }
]);
7. $unwind 阶段

将数组字段中的每个元素拆分为一个单独的文档。

// 假设 orders 集合中的每个文档有一个 items 数组字段,将其拆分为单独的文档
db.orders.aggregate([
    {
        $unwind: "$items"
    }
]);
8. $lookup 阶段

用于在多个集合之间进行连接操作,类似于 SQL 中的 JOIN

// 假设 orders 集合和 customers 集合,通过 customerId 字段进行连接
db.orders.aggregate([
    {
        $lookup: {
            from: "customers",
            localField: "customerId",
            foreignField: "_id",
            as: "customerDetails"
        }
    }
]);

综合示例

假设存在 orders 集合,文档结构如下:

[
    { "_id": 1, "product": "apple", "quantity": 10, "price": 2 },
    { "_id": 2, "product": "banana", "quantity": 20, "price": 1 },
    { "_id": 3, "product": "apple", "quantity": 5, "price": 2 }
]

现在要统计每种产品的总销售额,并按总销售额降序排序:

db.orders.aggregate([
    {
        // 计算每个订单的销售额
        $project: {
            product: 1,
            totalPrice: { $multiply: ["$quantity", "$price"] }
        }
    },
    {
        // 按产品分组,计算总销售额
        $group: {
            _id: "$product",
            totalSales: { $sum: "$totalPrice" }
        }
    },
    {
        // 按总销售额降序排序
        $sort: { totalSales: -1 }
    }
]);

选项说明

以下是一些常见的 options 参数:

  • allowDiskUse:当聚合操作的数据量很大时,允许使用磁盘空间来处理数据,避免内存不足的问题。
db.collection.aggregate(pipeline, { allowDiskUse: true });
  • explain:返回聚合操作的执行计划,用于分析和优化查询性能。
db.collection.aggregate(pipeline, { explain: true });

通过组合不同的聚合阶段和使用合适的选项,可以实现复杂的数据分析和处理任务。

智能网联汽车的安全员高级考试涉及多个方面的专业知识,包括但不限于自动驾驶技术原理、车辆传感器融合、网络安全防护以及法律法规等内容。以下是针对该主题的一些核心知识点解析: ### 关于智能网联车安全员高级考试的核心内容 #### 1. 自动驾驶分级标准 国际自动机工程师学会(SAE International)定义了六个级别的自动驾驶等级,从L0到L5[^1]。其中,L3及以上级别需要安全员具备更高的应急处理能力。 #### 2. 车辆感知系统的组成与功能 智能网联车通常配备多种传感器,如激光雷达、毫米波雷达、摄像头和超声波传感器等。这些设备协同工作以实现环境感知、障碍物检测等功能[^2]。 #### 3. 数据通信与网络安全 智能网联车依赖V2X(Vehicle-to-Everything)技术进行数据交换,在此过程中需防范潜在的网络攻击风险,例如中间人攻击或恶意软件入侵[^3]。 #### 4. 法律法规要求 不同国家和地区对于无人驾驶测试及运营有着严格的规定,考生应熟悉当地交通法典中有关自动化驾驶部分的具体条款[^4]。 ```python # 示例代码:模拟简单决策逻辑 def decide_action(sensor_data): if sensor_data['obstacle'] and not sensor_data['emergency']: return 'slow_down' elif sensor_data['pedestrian_crossing']: return 'stop_and_yield' else: return 'continue_driving' example_input = {'obstacle': True, 'emergency': False, 'pedestrian_crossing': False} action = decide_action(example_input) print(f"Action to take: {action}") ``` 需要注意的是,“橙点同学”作为特定平台上的学习资源名称,并不提供官方认证的标准答案集;建议通过正规渠道获取教材并参加培训课程来准备此类资格认证考试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我不是程序媛lisa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值