我有这些MongoDB模式:
var Wizard = new Schema({
name : { type: String }
, spell : { type: Schema.ObjectId, ref: 'Spell' }
});
var Spell = new Schema({
name : { type: String }
, damages : { type: Number }
});
字符串
如果我只是简单地查询文档,下面是示例JSON。
[{
name: 'Gandalf',
spell: {
name: 'Fireball',
damages: 20
}
}, {
name: 'Saruman',
spell: {
name: 'Frozenball',
damages: 10
}
}, {
name: 'Radagast',
spell: {
name: 'Lightball',
damages: 15
}
}]
型
我想从Wizard
模式中查询文档,但基于spell.damages
进行排序。
我在网上探索的方法并不令人满意,因为它们通常涉及一个聚合管道,首先查询Wizard
集合中的所有文档,填充spell
字段,然后最后基于spell.damages
字段进行排序。
我想实现的是能够对查询进行分页,同时根据spell.damages
字段进行排序。具体来说,我想避免管道首先查询Wizard
集合中的所有文档的步骤,因为我假设当该集合中的文档很大时,成本会很高。
我想到的唯一方法是将spell.damages
字段复制到Wizard
文档中,但这导致在值更改时需要维护Wizard
集合和Spell
集合上的信息。
有人有什么建议或其他方法吗?
1条答案
按热度按时间wmomyfyw1#
我能想到的提高性能的唯一方法是创建一个按需物化视图,因为:
按需示例化视图提供比标准视图更好的读取性能,因为它们是从磁盘读取的,而不是作为查询的一部分进行计算。这种性能优势会随着管道的复杂性和聚合数据的大小而增加。
在mongosh中创建视图函数:
字符串
执行函数以填充集合(视图):
型
现在,当你在
wizardsWithSpells
集合(视图)上执行查询时:型
您可以对预先填充的视图进行分页。
备注:每当需要刷新视图时,您都需要执行
sortWizardsWithSpells
函数。如果该视图需要频繁刷新,则这可能不是最佳选择。