MongoDB Change Stream: How to keep it alive?

Viewed 286

I've been trying to implement a change stream that monitors a Mongo collection for new documents. While simple to setup for catching one change, I don't understand how to keep the process running indefinitely.

db = pymongo_util.get_collection("DataDB","XYZ_Collection")
stream = db.watch(full_document="updateLookup"):
document = next(stream)  # it blocks here until a change happens.  Prints the change, and program ends
print(document)

My goal is to create a 'listener' for the database. Listen for new documents, and process those new documents. I'm not sure if asyncio is the way to go, threading, or if its something basic I'm missing.

It looks like I'm not the only one to ask, but none seem to have an answer:

  1. How to actually use pymongo ChangeStreams with Flask in a non-blocking way?

  2. Watch MongoDB Change Streams in Python asynchronous

1 Answers

Both referred question were about how to implement asynchronous behaviour. If you are happy with blocking reads, just loop over the iterator:

for document in stream:
    print(document)

It won't run indefinitely of course, but for some significant time. You will need to wrap it in try-except to catch cursor errors, and use resume_token to continue reading from where it aborted, but it's another story.

Related