MST
星途 面试题库

面试题:MongoDB复杂条件下多文档更新及性能优化

假设有一个大型电商数据库,其中'orders'集合存储订单信息,每个订单文档包含'customer_id'、'order_date'、'products'(数组,包含购买的商品信息)、'total_amount'等字段。现在需要对满足以下条件的订单进行更新:订单日期在过去一个月内,且购买的商品中有至少一个商品的价格大于100元,将这些订单的'total_amount'字段增加10%,同时在订单文档中添加一个新字段'discount_applied'并设置为'true'。请给出实现此更新的高效MongoDB操作代码,并分析在大数据量下如何优化性能。
23.6万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

MongoDB操作代码

// 获取当前日期
const currentDate = new Date();
// 计算一个月前的日期
const oneMonthAgo = new Date(currentDate.getTime() - 30 * 24 * 60 * 60 * 1000);

db.orders.updateMany(
    {
        order_date: { $gte: oneMonthAgo },
        "products.price": { $gt: 100 }
    },
    [
        {
            $set: {
                total_amount: { $multiply: ["$total_amount", 1.1] },
                discount_applied: true
            }
        }
    ]
);

大数据量下性能优化分析

  1. 索引优化
    • order_date字段创建升序索引,可加快对订单日期范围的筛选。
    db.orders.createIndex({order_date: 1});
    
    • products.price字段创建复合索引,由于查询条件涉及到数组内元素的字段,复合索引可以提高查询效率。例如,如果经常结合customer_id一起查询,可以创建复合索引:
    db.orders.createIndex({customer_id: 1, "products.price": 1});
    
  2. 批量处理:在大数据量场景下,不要一次性处理全部数据,可以按批次进行更新操作。例如,每次处理1000条数据,通过设置batchSize来控制。
  3. 使用聚合管道优化:在更新操作中,尽量使用聚合管道(如代码中所示),因为它提供了更强大和高效的数据处理能力。与传统的update操作相比,聚合管道可以更有效地处理复杂的更新逻辑。
  4. 硬件和集群优化
    • 确保服务器有足够的内存,以便MongoDB可以将更多的数据缓存到内存中,减少磁盘I/O。
    • 考虑使用MongoDB集群(如副本集和分片集群)来提高读写性能和数据可用性。对于大型电商数据库,分片可以将数据分布在多个节点上,从而提高查询和更新的效率。