MST
星途 面试题库

面试题:MongoDB聚合中数组表达式的嵌套与优化

给定一个集合,文档结构为:{ _id: ObjectId('64a9f85762967d9b98a2c977'), orders: [ { products: [ { name: 'product1', price: 20, quantity: 2 }, { name: 'product2', price: 30, quantity: 1 } ] }, { products: [ { name: 'product3', price: 15, quantity: 3 } ] } ] }。要求使用聚合框架和数组表达式,计算每个订单中所有产品的总金额,并且优化查询以提高性能,描述优化思路及实现代码。
18.3万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

优化思路

  1. 减少数据扫描:如果集合数据量很大,确保_id字段有索引,因为聚合操作可能会用到它来定位文档。
  2. 合理使用聚合阶段:按顺序安排聚合阶段,先过滤掉不需要的数据,再进行复杂的计算操作,减少中间数据量。

实现代码(以 MongoDB 为例)

db.collection('yourCollectionName').aggregate([
    {
        $unwind: "$orders"
    },
    {
        $addFields: {
            "orders.totalAmount": {
                $reduce: {
                    input: "$orders.products",
                    initialValue: 0,
                    in: { $add: ["$$value", { $multiply: ["$$this.price", "$$this.quantity"] }] }
                }
            }
        }
    }
]);

上述代码首先使用$unwindorders数组展开,然后通过$addFields$reduce数组表达式计算每个订单中产品的总金额并添加到orders文档中。