我正在运行与此类似的聚合查询示例:
https://www.compose.com/articles/aggregations-in-mongodb-by-example/
db.mycollection.aggregate([
{
{ $match: {"nested.field": "1110"}}, {
$group: {
_id: null,
total: {
$sum: "$nested.field"
},
average_transaction_amount: {
$avg: "$nested.field"
},
min_transaction_amount: {
$min: "$nested.field"
},
max_transaction_amount: {
$max: "$nested.field"
}
}
}
]);
我创建的一个集合有5,000,000个插入的大JSON文档(大约1,000 K-> V对,有些是嵌套的)。
在一个嵌套字段上添加索引之前 - 需要大约5分钟才能完成该字段的计数。 添加索引后 - 计数只需不到一秒钟(这很好)。
现在我正在尝试使用SUM或AVG或上面的任何其他类似示例 - 它需要几分钟(而不是几秒)。 有没有办法改善MongoDB中的聚合查询?
谢谢!
答案 0 :(得分:1)
不幸的是,group目前不使用mongodb中的索引。只有排序和匹配才能利用索引。因此,您编写的查询尽可能优化。
你可以做几件事。对于max和min,您可以只查询它们而不是使用聚合框架。您可以按$ nested.field进行排序,只需一个。您可以在$ nested.field上放置索引,然后可以使用相同的索引对升序或降序进行排序。
如果您可以控制数据的插入时间,并且查询非常简单,您可以自己跟踪数据。因此,您可以在mongo中有一个表,其中集合具有“Id”或您正在分组的任何内容,并且具有“total”和“sum”的字段。您可以在插入时增加它们,然后获得总数和平均值将是快速查询。不确定这是否适合您的情况,但是您可以做到最好。
一般来说,mongo超级快。在我看来,唯一不如SQL的地方就是聚合。这些好处远远超过了我的挣扎。根据我的建议,我通常会为这种情况保留单独的报告集。