解包后,sum文档的MongoDB聚合非常慢

时间:2015-04-20 09:40:26

标签: performance mongodb mongodb-query

我收到了来自商店的大量订单,想要获得购买特定商品的所有订单的摘要,例如在过去的30天里。我的问题是,该集合中的> 60.000文件非常慢。

JSON中的文档如下所示:

{ 
    "_id" : ObjectId("5531165b5e608cec23004e31"), 
    "Type" : NumberInt(2), 
    "Products" : [
        {
            "ProductId" : ObjectId("54a94242aa76d3db6cd5b23f"), 
            "Sku" : "abcdef", 
            "Quantity" : NumberInt(2), 
            "UnitPrice" : NumberInt(37)
        }, 
        {
            "ProductId" : ObjectId("54a9426baa76d3db6cd5fbce"), 
            "Sku" : "lmnopq", 
            "Quantity" : NumberInt(2), 
            "UnitPrice" : NumberInt(42)
        }
    ], 
    "Order" : "1234", 
    "Revenue" : NumberInt(158), 
    "Date" : ISODate("2015-04-14T12:55:28.000+0000"), 
    "Tax" : 25.23, 
    "Shipping" : NumberInt(20)
}

我使用的查询:

db.orders.aggregate([
{ $unwind: "$Products" }
{ $match: Date: { $gte: new Date("2015-03-21T00:00:00.000Z"), $lte: new Date("2015-04-19T23:59:59.999Z") }, Type: 2, Products.ProductId: ObjectId("54a94242aa76d3db6cd5b23f") }
{ $group: { _id: Products.ProductId, Sum: { $sum: 1 } } }
])

这是数据存储在集合中的方式的问题,还是我在查询中犯了错误?

提前谢谢。

1 个答案:

答案 0 :(得分:0)

您可以采取一些措施来加速/优化聚合操作:

1)确保您在Date字段

上有索引

2)尽可能早地将$match放在聚合管道中。因为 $match 操作可以最大限度地减少管道的处理量。