17370845950

服务端JavaScript_MongoDB聚合查询
使用MongoDB聚合查询可在Node.js中通过原生驱动或Mongoose实现,用于数据统计、分组、排序等复杂分析。基本结构为aggregate()方法接收管道数组,常用阶段包括$match筛选、$group分组计算、$sort排序、$project字段重塑及$limit/$skip分页。示例中统计已完成订单的用户总金额并取前五名。Node.js原生驱动需安装mongodb包,连接后调用aggregate()并传入管道操作,如筛选shipped状态订单、按产品ID分组计数并降序排列。Mongoose则语法更贴近Schema,支持链式调用,可用$lookup实现跨集合左连接,如关联用户信息后按城市分组求平均评分。合理组合管道阶段可提升数据处理能力,建议在$match和$sort前创建索引以优化性能,避免全表扫描。

服务端JavaScript中使用MongoDB进行聚合查询,通常是在Node.js环境下通过官方MongoDB驱动或Mongoose库来实现。聚合操作用于处理数据并返回计算结果,比如统计、分组、排序、筛选等,适合复杂的数据分析场景。

聚合查询基本结构

MongoDB的聚合通过aggregate()方法执行,接收一个管道操作数组,每个阶段对数据流进行处理。

常见聚合阶段包括:

  • $match:筛选符合条件的文档
  • $group:按字段分组,常配合$sum$avg等累计操作符使用
  • $sort:对结果排序
  • $project:重塑输出字段结构
  • $limit$skip:控制返回数量,用于分页

示例:统计每个用户订单总金额,并按金额降序排列前5名

db.orders.aggregate([
  { $match: { status: "completed" } },
  { $group: { _id: "$userId", total: { $sum: "$amount" } } },
  { $sort: { total: -1 } },
  { $limit: 5 }
])

在Node.js中使用原生驱动

安装MongoDB驱动:npm install mongodb

代码示例:

const { MongoClient } = require('mongodb');

async function aggregateOrders() {
  const client = new MongoClient('mongodb://localhost:27017');
  await client.connect();
  const db = client.db('shop');
  const result = await db.collection('orders')
    .aggregate([
      { $match: { status: "shipped" } },
      { $group: { _id: "$productId", count: { $sum: 1 } } },
      { $sort: { count: -1 } }
    ]).toArray();
  console.log(result);
  await client.close();
}

使用Mongoose进行聚合

Mongoose也支持.aggregate()方法,语法更贴近Schema定义。

示例:

Order.aggregate([
  {
    $lookup: {
      from: 'users',
      localField: 'userId',
      foreignField: '_id',
      as: 'user'
    }
  },
  { $unwind: "$user" },
  { $group: { _id: "$user.city", avgScore: { $avg: "$score" } } }
])
.then(result => console.log(result))
.catch(err => console.error(err));

其中$lookup用于实现类似SQL的左连接,是跨集合分析的重要工具。

基本上就这些。掌握聚合管道的组合方式,能大幅提升服务端数据处理能力。注意性能优化,如在$match和$sort前添加索引,避免全表扫描。不复杂但容易忽略。