MST

星途 面试题库

面试题:MongoDB Shell脚本优化及复杂业务场景处理

假设有一个包含大量文档的集合,文档结构如下:{ 'product': '产品名', 'category': '产品类别','sales': [ { 'date': '日期', 'amount': 销售金额 } ] }。请编写MongoDB Shell脚本,统计每个产品类别在过去一周内的总销售额,要求考虑性能优化,尽量减少对数据库的查询压力,并且如果数据量过大可能需要处理分页问题。阐述实现原理及详细脚本代码。
11.1万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

实现原理

  1. 数据筛选:通过$match操作符筛选出过去一周内的销售数据。可以通过$gte(大于等于)和$lt(小于)操作符结合当前日期计算出一周前的日期来实现。
  2. 分组统计:使用$group操作符按category进行分组,并对每个分组内的amount进行求和,得出每个产品类别的总销售额。
  3. 性能优化及分页处理:为了减少数据库查询压力,确保在sales.date字段上建立索引。对于分页问题,可以使用$skip$limit操作符。

详细脚本代码

// 计算一周前的日期
var oneWeekAgo = new Date();
oneWeekAgo.setDate(oneWeekAgo.getDate() - 7);

// 确保在 sales.date 字段上建立索引
db.collection('your_collection_name').createIndex({'sales.date': 1});

// 聚合查询
var pipeline = [
    {
        $unwind: '$sales'
    },
    {
        $match: {
           'sales.date': {
                $gte: oneWeekAgo
            }
        }
    },
    {
        $group: {
            _id: '$category',
            totalSales: {
                $sum: '$sales.amount'
            }
        }
    },
    // 分页示例,这里假设跳过0条记录,限制返回10条记录
    {
        $skip: 0
    },
    {
        $limit: 10
    }
];

var result = db.collection('your_collection_name').aggregate(pipeline);
result.forEach(function(doc) {
    printjson(doc);
});

在上述代码中:

  1. oneWeekAgo计算出一周前的日期。
  2. createIndexsales.date字段上建立索引以提高查询性能。
  3. $unwind操作符将sales数组展开,以便后续操作。
  4. $match筛选出过去一周内的销售数据。
  5. $groupcategory分组并计算总销售额。
  6. $skip$limit用于分页,示例中跳过0条记录并限制返回10条记录,实际应用中可以根据需求调整。最后通过forEach遍历输出结果。