我目前正在将Mongoose用于一个项目,并且正在尝试优化一些汇总查询。
对于MongoDB,使用缓存来缓存结果非常简单:
const res = cache.get(key);
if (res) {
return res;
}
MyModel.aggregate([]).then(docs => {
cache.add(key, docs);
});
但是在我的情况下,我有一堆聚合,它们在管道的最初阶段就具有类似的繁重操作
const c = MyModel.aggregate([
{$match : {},}}
{$project :{}},
{$unwind :{}},
// extra stages for c
]);
const d = MyModel.aggregate([
{$match : {},}}
{$project :{}},
{$unwind :{}},
// extra stages for d
]);
我已经使用索引和allowDiskUse
选项优化了我的架构,我正在寻找更多好处。
是否有任何方法可以使用缓存机制来填充管道的第一阶段,甚至可以通过管道来聚合? MongoDB是否在阶段管道中缓存任何结果?
将转换移动到客户端不是一种选择,因为我想尽可能多地使用数据库中的功能。 预先感谢。
答案 0 :(得分:0)
我已经根据JohnnyHK的评论找到了一种可靠的汇总聚合方式。
我已将临时收藏与TTL indexes
一起使用const mongoose = require('mongoose');
const s = mongoose.Schema({
// ...
}, {timestamps: true});
s.index({createdAt: 1},{expireAfterSeconds: 3600});
const CachingModel = mongoose.model('Cache', s);
const getData = async () => {
await Model1.aggregate([
{$match : {}}
{$project :{}},
{$unwind :{}},
{$out: 'Cache'}
]);
return Promise.all([
CachingModel.aggregate([
// #1 aggregate the matching results
]),
CachingModel.aggregate([
// #2 aggregate the matching results
])
];
}