【发布时间】:2019-08-13 13:11:34
【问题描述】:
我有一个名为“问题”的集合,其中包含大约 15 个字段。有一个名为“用户”的索引字段。另一个字段是“response_api”,它是一个大约 60KB 的子文档。这个集合中大约有 40000 个文档。
当我在用户字段上仅使用 $match 阶段运行聚合查询时,它非常慢,大约需要 11 秒才能完成。 查询是:
db.questions.aggregate([{$match: {user: ObjectId("5c9a19abc89b2d09740ccd1d")} }])
但是,当我使用 $project 阶段运行相同的查询时,它会在不到 10 毫秒内快速返回。查询是:
db.questions.aggregate([{$match: {user: ObjectId("5c9a19abc89b2d09740ccd1d")} }, {$project: {_id: 1, user: 1, subject: 1}}])
注意:这个特定用户在问题集合中有 5000 个文档。
当我复制这个没有“response_api”字段的集合并在用户字段上创建索引时,复制的集合上的这两个查询都非常快,并且花费了不到 10 毫秒。
有人能解释一下这里发生了什么吗?是因为那个大领域吗?
【问题讨论】:
-
有意义的是,包含大字段的查询会比没有它的查询慢得多,对吧?
-
@JohnnyHK 是的,这正是正在发生的事情。但是...我最近注意到一个奇怪的行为,如果我运行“查找”查询而不是聚合,无论有没有大字段,它都会运行得非常快。这种行为让这个问题更加奇怪
标签: mongodb mongodb-query aggregation-framework