Я создаю своего рода фоновую систему очередей заданий с MongoDB в качестве хранилища данных. Как я могу «прослушать» вставки в коллекцию MongoDB, прежде чем создавать рабочих для обработки работы? Нужно ли опрашивать каждые несколько секунд, чтобы увидеть, есть ли какие-либо изменения с прошлого раза, или есть ли способ, которым мой сценарий может ожидать вставки? Это PHP-проект, над которым я работаю, но не стесняйтесь отвечать на Ruby или не зависимо от языка.
200
Ответы:
То, о чем вы думаете, звучит очень похоже на триггеры. MongoDB не имеет никакой поддержки триггеров, однако некоторые люди «свернули свои собственные», используя некоторые приемы. Ключевым моментом здесь является оплог.
Когда вы запускаете MongoDB в наборе реплик, все действия MongoDB записываются в журнал операций (известный как oplog). Оплог - это просто список изменений, внесенных в данные. Реплики Устанавливает функцию, прослушивая изменения в этом журнале операций и затем применяя изменения локально.
Это звучит знакомо?
Я не могу описать весь процесс здесь, это несколько страниц документации, но инструменты, которые вам нужны, доступны.
Сначала несколько рецензий на оплог - Краткое описание - Макет
local
сборника (который содержит оплог)Вы также захотите использовать настраиваемые курсоры . Это даст вам возможность прослушивать изменения, а не опрашивать их. Обратите внимание, что для репликации используются настраиваемые курсоры, поэтому это поддерживаемая функция.
источник
--replSet
параметром, и он создаст / заполнитoplog
. Даже без вторичного. Это, безусловно, единственный способ «прослушать» изменения в БД.MongoDB имеет то, что называется,
capped collections
иtailable cursors
это позволяет MongoDB передавать данные слушателям.По
capped collection
сути, A - это коллекция фиксированного размера, которая допускает только вставки. Вот как это будет выглядеть:MongoDB Tailable курсоры ( оригинальный пост Джонатана Х. Вейджа )
Рубин
PHP
Питон ( Роберт Стюарт)
Perl ( Макс )
Дополнительные ресурсы:
Ruby / Node.js Tutorial, который проведет вас через создание приложения, которое прослушивает вставки в ограниченную коллекцию MongoDB.
Статья, рассказывающая о настраиваемых курсорах более подробно.
Примеры использования настраиваемых курсоров на PHP, Ruby, Python и Perl.
источник
Начиная с MongoDB 3.6 появится новый API уведомлений под названием Change Streams, который вы можете использовать для этого. Смотрите этот пост в блоге для примера . Пример из этого:
источник
Проверьте это: изменение потоков
10 января 2018 г. - выпуск 3.6
* РЕДАКТИРОВАТЬ: я написал статью о том, как это сделать https://medium.com/riow/mongodb-data-collection-change-85b63d96ff76
https://docs.mongodb.com/v3.6/changeStreams/
Это новое в mongodb 3.6 https://docs.mongodb.com/manual/release-notes/3.6/ 2018/01/10
Для использования changeStreams база данных должна быть набором репликации
Ваша база данных будет « Автономной » по умолчанию.
Следующий пример - практическое применение того, как вы можете это использовать.
* Специально для Node.
Полезные ссылки:
https://docs.mongodb.com/manual/tutorial/convert-standalone-to-replica-set
https://docs.mongodb.com/manual/tutorial/change-streams-example
https://docs.mongodb.com/v3.6/tutorial/change-streams-example
http://plusnconsulting.com/post/MongoDB-Change-Streams
источник
MongoDB версии 3.6 теперь включает потоки изменений, которые, по сути, представляют собой API поверх OpLog, что позволяет использовать сценарии, подобные триггерам / уведомлениям.
Вот ссылка на пример Java: http://mongodb.github.io/mongo-java-driver/3.6/driver/tutorials/change-streams/
Пример NodeJS может выглядеть примерно так:
источник
В качестве альтернативы вы можете использовать стандартный метод Mongo FindAndUpdate и в обратном вызове инициировать событие EventEmitter (в узле) при выполнении обратного вызова.
Любые другие части приложения или архитектуры, прослушивающие это событие, будут уведомлены об обновлении, и любые соответствующие данные также будут отправлены туда. Это действительно простой способ получения уведомлений от Mongo.
источник
Многие из этих ответов дадут вам только новые записи, а не обновления и / или крайне неэффективны
Единственный надежный и эффективный способ сделать это - создать настраиваемый курсор в локальной коллекции db: oplog.rs, чтобы получить ВСЕ изменения в MongoDB и делать с ними все, что вы захотите. (MongoDB даже делает это внутренне более или менее для поддержки репликации!)
Объяснение содержания оплога: https://www.compose.com/articles/the-mongodb-oplog-and-node-js/
Пример библиотеки Node.js, которая предоставляет API вокруг того, что можно сделать с помощью оплога: https://github.com/cayasso/mongo-oplog
источник
Существует потрясающий набор доступных сервисов, который называется MongoDB Stitch . Посмотрите на функции / триггеры стежка . Обратите внимание, что это облачный платный сервис (AWS). В вашем случае, при вставке, вы можете вызвать пользовательскую функцию, написанную на javascript.
источник
Существует рабочий пример Java, который можно найти здесь .
Ключ - ВАЖНЫЕ ВАРИАНТЫ приведенные здесь.
Также вы можете изменить запрос поиска, если вам не нужно каждый раз загружать все данные.
источник
На самом деле, вместо просмотра вывода, почему вы не получаете уведомления, когда вставляется что-то новое, используя промежуточное ПО, предоставленное схемой mongoose
Вы можете поймать событие вставки нового документа и сделать что-то после того, как эта вставка сделана
источник
После версии 3.6 разрешено использовать базу данных следующих типов триггеров базы данных:
Войдите в свою учетную запись Atlas, выберите
Triggers
интерфейс и добавьте новый триггер:Разверните каждый раздел для получения дополнительных настроек или деталей.
источник