【发布时间】:2021-11-02 16:13:12
【问题描述】:
我有一个包含大约 50,000 个项目的集合,其中创建了索引,例如name 和 _id
如果我使用db.items.find().sort({ name: 1, _id: 1 })
或:
db.items.aggregate([
{
$match: {}
},
{
$sort: {
name 1,
_id: 1
}
}
])
然后它超过了 RAM 限制:Executor error during find command :: caused by :: Sort operation used more than the maximum 33554432 bytes of RAM. Add an index, or specify a smaller limit.,如果我想让它工作,我必须通过 { allowDiskUse: true } 来聚合。
但是,当我在聚合管道中使用 $group 阶段时,它不会超过 RAM 限制并且可以正常工作:
db.items.aggregate.aggregate([
{
$match: {}
},
{
$sort: {
name 1,
_id: 1
}
},
{
$group: {
_id: 1,
x: {
$push: {
_id: '$_id'
}
}
}
}
])
为什么仅$sort 会发生这种情况,而$sort + $group 不会发生这种情况?
【问题讨论】:
-
您是否有两个独立的 name 和 id 索引或一个单一的 name 和 id 组合的复合索引(按此顺序)?
-
我对名称和 ID 有单一索引,我不知道复合索引。现在我可以在不超过 RAM 限制的情况下进行查询。感谢您的帮助。
标签: mongodb aggregation-framework aggregate