#mongodb #aggregation-framework
#mongodb #структура агрегации
Вопрос:
Я использую конвейер агрегации MongoDB для создания новой коллекции B, содержащей агрегированные результаты из коллекции A. Для этой цели я использую этап $out . Каждый раз, когда я запускаю конвейер агрегации, могут добавляться новые документы, некоторые могут обновляться, а некоторые удаляться.
Теперь я хотел бы иметь поток изменений над агрегированной коллекцией B, чтобы получать уведомления, когда агрегация генерирует результаты, отличные от предыдущего (т. Е. Хотя бы одну вставку / обновление / удаление).
Однако, если я использую $out
сцену, коллекция воссоздается при каждом выполнении, и я получаю rename
и invalidate
изменяю, а затем поток закрывается. Я могу использовать start_after
токен возобновления, чтобы снова открыть поток, но я не уведомлен об изменениях ( rename
и invalidate
).
Я попытался использовать $merge, чтобы избежать повторного создания коллекции. Поток изменений работает так, как я ожидаю, но я больше не могу удалять старые документы из коллекции B.
Есть ли способ заставить мой вариант использования работать (т. Е. Результатом конвейера агрегации является новое содержимое коллекции получение уведомления об изменениях для вставки / удаления / обновления из предыдущего содержимого коллекции)?
Ответ №1:
$out не отличает новый результирующий набор от предыдущего содержимого коллекции. Он удаляет предыдущее содержимое и вставляет новые документы.
Поэтому в MongoDB нет ничего, что знало бы, какие документы были добавлены в B, а какие были удалены. Я не понимаю, как вы могли бы получить эту информацию через поток изменений на B.
Боюсь, вам нужно будет придумать другое решение.
Комментарии:
1. Это тоже был мой вывод. Спасибо за подтверждение, что я ничего не пропустил.