【发布时间】:2017-07-24 20:37:36
【问题描述】:
我有一个 MongoDB 集合,其中包含一些网站爬虫的结果。 文档架构看起来或多或少像这样:
{
mainID: "number",
// sometimes very big, up to 10,000 right now
links: [
{
foo: 'bar',
},
//... more documents
]
}
我需要查询此集合以获取用户帐户的一些统计信息。为每个 mainID 最后插入的每个文档计算统计信息。
所有文档都是 mainID 的报告(经常插入)。
我目前使用此查询一次获取所有数据(在对每个 mainID 进行查询之前,如果不完全相同,时间也是相似的):
db.getCollection('collectionName').aggregate([
{
$match: {
mainID: {
$in: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
},
}
},
{
$group: {
_id: "$mainID",
links: {
$first: "$links"
},
// some more fields here
}
}
])
查询需要大约 3 到 5 秒来获取数据。然后我对链接数组进行一些额外的统计计算,例如根据值对字段进行一些计数。这需要几毫秒。 mainID 也被索引,这应该会加速第一个 $match。
我是 mongo 的新手,不知道如何继续。由于该功能仍处于试验阶段,因此我也愿意更改架构。不需要迁移,我仍然可以刷新所有数据并重新开始。
任何建议将不胜感激。
【问题讨论】:
-
您能否发布一个更具体的示例,例如1)包含必要字段的文档示例,以及 2)实际上与文档示例对齐的聚合示例?不清楚
$contentTestId是什么,为什么需要$first等 -
哦,我更改了键名,但显然不是全部。编辑了问题。我需要 $first 来获取我查询的每个 mainID 的最后插入的文档字段。我已经注意到,当我 $group 没有 .links 时,它的速度非常快。 .links 是一个大数组,因此我怀疑这只是一个获取问题。
-
如果没有
links很快,也有可能是索引问题。您对收藏有哪些索引?您可以发布查询explain()结果吗?更多信息在这里:docs.mongodb.com/manual/reference/explain-results 以及如何解释聚合查询:docs.mongodb.com/manual/reference/method/…(请参阅options部分) -
我重写了整个查询,首先做组来获取我需要的文档的_id(mongo ids)($group->$first)。然后在另一个查询中,只需 .find 那些 _id(s)。 $group 阶段非常快, .find() (获取链接)再次变慢。我只有 _id 和 mainID 的索引。我有什么理由应该为我获取的字段提供链接吗?或者可能是因为服务器性能和链接大小(至少在获取的文档长度为 10,000)上很慢。
-
感谢@KevinAdistambha 为我指明了正确的方向。单独缓存统计数据是我痛苦的答案。 .links 字段中的大数组是原因。
标签: mongodb