MongoDB sum 文档的聚合在展开后非常慢
MongoDB aggregation for sum documents very slow after unwrap
我有大量来自一家商店的订单,我想获得购买特定商品的所有订单的摘要,例如在过去 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) 确保在 Date
字段上有一个索引,
2) 尽可能早地将 $match
放在聚合管道中。因为 $match
操作最小化了管道的处理量。
我有大量来自一家商店的订单,我想获得购买特定商品的所有订单的摘要,例如在过去 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) 确保在 Date
字段上有一个索引,
2) 尽可能早地将 $match
放在聚合管道中。因为 $match
操作最小化了管道的处理量。