我有两个集合people
和actions
,它们以1:n的比例相连,所以每个人都可以有很多动作。
我正在寻找一种有效的方法来获得采取特定行动的人数。
我所做的是在actions
上创建一个汇总,匹配相关文档,然后对其进行分组和投影,然后计算生成的文档。虽然这对于小型数据集非常适用,但是当许多操作符合我的条件时,它对于大型集合来说会花费太长时间(太长的时间,从PHP查询时,我会收到超时)。
这是聚合管道:
db.actions.aggregate(
[
{
"$match" : {
"name" : {
"$ne" : null
}
}
},
{
"$group" : {
"_id" : {
"person_nosql_id" : "$person_nosql_id"
},
"COUNT(person_nosql_id)" : {
"$sum" : 1.0
}
}
},
{
"$project" : {
"person_nosql_id" : "$_id.person_nosql_id",
"COUNT(person_nosql_id)" : "$COUNT(person_nosql_id)",
"_id" : 0.0
}
}
],
{
"allowDiskUse" : true
}
);
person_nosql_id
是到people
的外键连接。在我的收藏中,我有25万人,总共进行了460万次操作。 group
和project
阶段分别需要15秒钟。
您知道任何加快查询速度的方法吗?还是获得所需结果的另一种方法?我已经设置了所有相关的索引。