gpt4 book ai didi

mongodb - 查找聚合性能差

转载 作者:IT老高 更新时间:2023-10-28 13:12:56 26 4
gpt4 key购买 nike

我有两个收藏

帖子:

{
"_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,很可能我搞砸了这个查询。

最佳答案

来自 https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/

foreignField Specifies the field from the documents in the from collection. $lookup performs an equality match on the foreignField to the localField from the input documents. If a document in the from collection does not contain the foreignField, the $lookup treats the value as null for matching purposes.

这将与任何其他查询一样执行。

如果您在字段 _AccountId 上没有索引,它将对 10,000 个帖子中的每一个执行全表扫描查询。大部分时间将花在该 tablescan 上。

db.users.ensureIndex("_AccountId", 1) 

加快了进程,因此它执行 10,000 次索引命中而不是 10,000 次表扫描。

关于mongodb - 查找聚合性能差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43742635/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com