【发布时间】:2017-09-30 06:10:46
【问题描述】:
我有两个收藏
帖子:
{
"_Id": "1",
"_PostTypeId": "1",
"_AcceptedAnswerId": "192",
"_CreationDate": "2012-02-08T20:02:48.790",
"_Score": "10",
...
"_OwnerUserId": "6",
...
},
...
和用户:
{
"_Id": "1",
"_Reputation": "101",
"_CreationDate": "2012-02-08T19:45:13.447",
"_DisplayName": "Geoff Dalgas",
...
"_AccountId": "2"
},
...
我想找到写 5 到 15 个帖子的用户。 这就是我的查询的样子:
db.posts.aggregate([
{
$lookup: {
from: "users",
localField: "_OwnerUserId",
foreignField: "_AccountId",
as: "X"
}
},
{
$group: {
_id: "$X._AccountId",
posts: { $sum: 1 }
}
},
{
$match : {posts: {$gte: 5, $lte: 15}}
},
{
$sort: {posts: -1 }
},
{
$project : {posts: 1}
}
])
而且它的工作速度非常慢。对于 6k 个用户和 10k 个帖子,需要 40 多秒才能得到响应,而在关系数据库中,我会在一瞬间得到响应。 问题出在哪里?我刚刚开始使用 mongodb,很可能我搞砸了这个查询。
【问题讨论】:
-
您尝试使用非关系数据库关联数据,然后发现它比关系数据库花费更多时间?您确实需要确保 _accountId 字段上有索引。
-
@bauman.space 这就是问题所在。现在只需要 700 毫秒!
-
标记了答案,并附有指向其工作原理的链接。
标签: mongodb aggregation-framework