MongoDB缓存聚合阶段

时间:2018-09-19 23:00:15

标签: mongodb caching mongoose

我目前正在将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是否在阶段管道中缓存任何结果?

将转换移动到客户端不是一种选择,因为我想尽可能多地使用数据库中的功能。 预先感谢。

1 个答案:

答案 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
    ])
  ];
}