Этапы агрегации кеша MongoDB - PullRequest
       4

Этапы агрегации кеша MongoDB

0 голосов
/ 20 сентября 2018

В настоящее время я использую 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 голосов
/ 20 сентября 2018

Я нашел надежный способ кэширования агрегатов на основе комментария JohnnyHK.

Я использовал временную коллекцию с TTL-индексами

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
    ])
  ];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...