gpt4 book ai didi

mongodb - 如何在聚合管道中执行 $match 阶段时添加限制

转载 作者:行者123 更新时间:2023-12-04 14:21:26 24 4
gpt4 key购买 nike

在执行 find() 查询时,我可以传递限制和排序等选项。我认为,这意味着数据库将在找到限制数量的文档后停止尝试过滤匹配的文档。

当尝试使用聚合管道完成相同的事情时,我将 find() 中的相同查询作为 $match 阶段,但我无法指定限制。

$limit 的问题在于它只发生在下一阶段,因此 mongo 会在将集合中的每个文档传递到下一阶段之前处理它,随着集合大小的增加,这会变得非常慢。

最佳答案

聚合框架就像一个流,所以如果你有一个 $limit管道中的阶段,一旦达到限制,它将停止处理。

例如:

> db.test.find()
{ "_id": 0 }
{ "_id": 1 }
{ "_id": 2 }
{ "_id": 3 }
{ "_id": 4 }

假设我想使用 $match阶段后跟 $limit阶段。使用 explain()关于聚合:

> db.test.explain('executionStats').aggregate([
{$match: {_id: {$lte: 3}}},
{$limit: 1}
])
...
"executionStats": {
"executionSuccess": true,
"nReturned": 1,
"executionTimeMillis": 0,
"totalKeysExamined": 1,
"totalDocsExamined": 1,
...

解释输出显示 MongoDB 仅检查了 1 个键 (totalKeysExamined: 1) 和 1 个文档 (totalDocsExamined: 1) 以返回 1 个文档 (nReturned: 1) 由于 $limit阶段。这是尽管我指定它匹配 _id <= 3 , 应选择 4 个文档。

请注意,大多数阶段都是这样工作的,但像 $group 这样的阶段除外。它需要收集所有必需的文档,然后才能对它们进行分组。放$limit$group 之后不会制作 $limit阶段充当流,因为它必须等待 $group在限制输出之前完成其过程的阶段。

查看 Explain ResultsAggregation Pipeline Optimization获取更多信息。

关于mongodb - 如何在聚合管道中执行 $match 阶段时添加限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54318423/

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