【发布时间】:2019-06-05 07:40:21
【问题描述】:
我想使用一个方面来创建一个简单的查询,我可以使用它来获取分页数据,但是我注意到如果我这样做,与只运行两个单独的查询相比,我的性能真的很差。
作为一个快速测试,我创建了一个包含 50000 个随机文档的集合并运行了以下测试。
var x = new Date();
var a = {
count : db.getCollection("test").find({}).count(),
data: db.getCollection("test").find({}).skip(0).limit(10)
};
var y = new Date();
print('result ' + a);
print(y - x);
var x = new Date();
var a = db.getCollection("test").aggregate(
[
{
"$match" : {
}
},
{
"$facet" : {
"data": [
{
"$skip": 0
},
{
"$limit": 10
}
],
"pageInfo": [
{
"$group": {
"_id": null,
"count": {
"$sum": 1
}
}
}
]
}
}
]
)
var y = new Date();
print('result ' + a);
print(y - x);
这样做的结果是两个单独的查询一个用于查找另一个用于计数大约需要 2 毫秒,而聚合单个查询需要 500 毫秒。 p>
为什么聚合这么慢?
更新
即使只是在聚合中没有分面的计数也很慢
var x = new Date();
var a = db.getCollection("test").find({}).count();
var y = new Date();
print('result ' + a);
print(y - x);
var x = new Date();
var a = db.getCollection("test").aggregate(
[
{ "$count" : "count" }
]
)
var y = new Date();
print('result ' + a);
print(y - x);
在上面我的测试数据集中,聚合计数需要 200ms 而 Count 方法需要 2ms。
此问题延伸到 NodeJs Mongodb 驱动程序,其中 .Count() 方法已被弃用并替换为 countDocuments() 方法,在幕后,新的 countDocuments() 方法使用聚合而不是计数方法发现就像我上面的示例一样,它的性能明显更差,以至于我将继续使用已弃用的方法而不是较新的 countDocuments() 方法。
【问题讨论】:
-
删除第一个
$match阶段并使用$count查询而不是$group....aggregate([ { "$facet" : { "data": [ { "$skip": 0 }, { "$limit": 10 } ], "pageInfo": [ { $count:"count" } ] }} ]) -
@AnthonyWinzlet 它是专门格式化的,因为我有一个复杂的 $match 这是一个显示问题的简化示例。这就是聚合中的计数很慢。
标签: mongodb aggregation-framework