Подтвердить что ты не робот

Какие базы данных NoSQL, если таковые имеются, могут предоставлять поток * изменений * в набор результатов запроса?

Какие базы данных NoSQL, если таковые имеются, могут предоставлять поток изменений в набор результатов запроса?

Может ли кто-нибудь указать мне на некоторые примеры?

Во-первых, я считаю, что ни одна из баз данных SQL не предоставляет эту функциональность - я прав?

Мне нужно указать произвольные простые запросы, чей эквивалент в SQL может быть записан:

SELECT * FROM accounts WHERE balance < 0 and balance > -1000;

Мне нужен начальный набор результатов:

id: 100, name: Fred, balance: -10
id: 103, name: Mary, balance: -200

но затем я хочу, чтобы поток изменений выполнялся навсегда, пока я не остановил их:

meta: remove, id: 100
meta: add,    id: 104, name: Alice, balance: -300
meta: remove, id: 103
meta: modify, id: 104, name: Alice, balance: -400
meta: modify, id: 104, name: Alison, balance: -400
meta: add,    id: 101, name: Clive, balance: -200
meta: modify, id: 104, name: Alison, balance: -100
...

Примечание. Я не говорю о потоковой передаче больших наборов результатов. Я ищу поток изменений в режиме реального времени.

Кроме того, он должен масштабироваться, если это возможно.

Спасибо,

Крис.

4b9b3361

Ответ 1

Хотя ответ был принят, есть еще один ответ, который доходит до сути предположений под вашим вопросом.

Что такое бизнес-проблема, связанная с получением списка изменений данных? Что делать, если вместо простого получения списка изменений в данных вы получили набор событий, которые рассказывали вам, почему и как изменились данные.

Эта концепция является одной из основных причин, лежащих в основе "CQRS" как архитектуры. В основном вы сохраняете все события, вызвавшие изменение ваших данных, например. FundsDeposited, FundsWithdrawn и т.д., И вы получаете возможность "переигрывать" эти события и обнаруживать не только то, как ваши данные менялись со временем, но почему.

Как только вы спуститесь по этой дороге, вы получите возможность хранить события как поток, и вы больше не ограничены небольшой горсткой хранилищ. Вместо этого вы могли бы буквально использовать любой механизм хранения, и это выполнило бы работу.

Ответ 2

У CouchDB есть фид изменений. В основном это цепочка блоков или история каждого изменения в базе данных с момента ее создания. Вы можете получить канал через JSON, JSONP, длительный опрос или как непрерывный поток и написать приложения, которые отвечают на изменения в базе данных.

Здесь меняются фиды из моего блога

Чтобы узнать больше, этот раздел руководства CouchDB

Ответ 3

Не уверен, что это именно то, что вы ищете, но считали, что это возможно достаточно, чтобы гарантировать упоминание!

Если вы используете репликацию в MongoDB, все операции записи сохраняются в oplog (журнал операций). Поэтому каждая вставка/обновление/удаление записывается там, чтобы их можно было воспроизвести на вторичных узлах. Это ограниченная коллекция, поэтому циклически циклируется и перезаписывается (вы можете установить ее размер). Но теоретически этот oplog можно использовать как способ получить поток изменений - я сам не пробовал, но, возможно, вы могли опросить этот oplog.

Ответ 4

Только мозговой штурм:

Возьмем, к примеру, MongoDB И не хотим получать доступ к фиду изменений, как описано выше. Да, это звучит дрянной по сравнению с другими ответами, но это была моя первая идея, прежде чем эти ответы появились во время написания...

Текущие функции, связанные с этим вопросом, - это Capped Collections (http://www.mongodb.org/display/DOCS/Capped+Collections) и, возможно, выполнение кода на стороне сервера (http://www.mongodb.org/display/DOCS/Server-side+Code+Execution).

С закрытыми коллекциями было бы легче писать много данных, но читать меньше (например, файлы журналов) - этот тип коллекции создается для таких случаев. серверные скрипты можно использовать для аутсорсинга большого количества обработки (меньше кода приложения), но вы можете оставить эту точку, если хотите полностью интегрировать логику в своем приложении.

Не знаю, есть ли в NoSQL DB с "hooks". Я знаю, что это возможно в postgres (SQL).

В настоящее время логика потоковой передачи должна быть реализована в коде приложения AFAIK.

В CouchDB это возможно с помощью "Представлений", которые не реализованы в MongoDB (если это неверно, сообщите мне ссылку, это тоже интересная тема!).

Не знаю, полезно ли это. Это моя первая попытка ответить здесь на SO.

Ответ 5

этот тип вещей должен выполняться в приложении, а не в базе данных.

Значение, каждый раз, когда вы вносите изменения, он должен записываться как новая запись. Не внесение изменений в запись. В вашем приложении вы можете добавить больше интеллекта, если вы сделаете это так.

Ответ 6

Начиная с версии 3..6, MongoDB использует Изменить потоки, чтобы приложения могли подписаться на список изменений в реальном времени:

Изменить потоки позволяют приложениям получать доступ к изменениям данных в реальном времени без сложностей и риска хвоста в oplog. Приложения могут использовать потоки изменений для подписки на все изменения данных в коллекции и немедленно реагировать на них.

Изменение потоков может принести пользу архитектуре с зависимыми бизнес-системами, информируя о нижестоящих системах, как только изменения данных будут долговечны. Например, потоки изменений могут сэкономить время для разработчиков при реализации сервисов Extract, Transform и Load (ETL), межплатформенной синхронизации, функциональности совместной работы и служб уведомлений.

По умолчанию поток возвращает изменения ко всем документам в коллекции, но вы можете добавить конвейер агрегирования для фильтрации только документов, которые соответствуют вашему набору результатов запроса.

Ответ 7

Если получение всех изменений (не только изменений в наборе результатов запроса) является accepteble, тогда вы можете создать ведомость репликации mongodb и получить все изменения от master. Я видел ведомое устройство репликации mongodb, написанное даже в php, поэтому его не должно быть слишком сложно реализовать.

Ответ 8

mongoDB реализует tailable-cursor, но только для ограниченных коллекций. См. docs. Он может быть полезен в зависимости от ваших конкретных требований.