У меня есть БД, куда я отправляю некоторые данные. В то же время я запускаю скрипт Python и хотел бы, чтобы этот скрипт отправлял на мою консоль последнюю запись в базу данных MongoDB, как только она будет добавлена.

Я искал решение этой проблемы в течение нескольких дней, но ничего не нашел.

Я провел некоторое исследование и обнаружил: а) настраиваемый курсор, но единственная проблема заключается в том, что моя база данных не ограничена, и, поскольку я буду помещать данные каждые 5 секунд, я боюсь, что ограниченной базы данных будет недостаточно для моих нужд так как, когда достигнут максимальный размер, он начнет перезаписывать самые старые записи. b) change_streams, но моя база данных не является набором реплик, я довольно новичок в этом, поэтому мне все равно придется изучать более сложные темы, такие как RS.

Любой совет?

Вот что у меня получилось:

from pymongo import MongoClient
import pymongo
import time
import random
from pprint import pprint

#Step 1: Connect to MongoDB - Note: Change connection string as needed
client = MongoClient(port=27017)


db = client.one

mycol = client["coll"]


highest_previous_primary_key = 1

while True:
    cursor = db.mycol.find()
    for document in cursor:

        # get the current primary key, and if it's greater than the previous one
        # we print the results and increment the variable to that value
        current_primary_key = document['num']
        if current_primary_key > highest_previous_primary_key:
            print(document['num'])
            highest_previous_primary_key = current_primary_key

Но проблема в том, что он прекратит печатать после 4-й записи, плюс я не знаю, будет ли это лучшим решением, когда в моей БД будет много данных.

Любой совет?

2
Jack022 15 Ноя 2018 в 22:13

2 ответа

Лучший ответ

b) change_streams, но моя база данных не является набором реплик, я довольно новичок в этом, поэтому мне все еще нужно узнать о более сложных темах, таких как RS

Наборы реплик обеспечивают избыточность и высокую доступность и являются основой для всех производственных развертываний MongoDB. При этом для тестирования и / или развертывания вы можете развернуть набор реплик только с одним членом. Для примера локального тестирования:

mongod --dbpath /path/data/test --replSet test

После запуска локального тестового сервера подключитесь к оболочке mongo. для выполнения rs.initiate ():

mongo
> rs.initiate()

См. Соответствующий Развертывание набора реплик для тестирования и развертывания

try:
    # Only catch insert operations
    with client.watch([{'$match': {'operationType': 'insert'}}]) as stream:
        for insert_change in stream:
            print(insert_change)
except pymongo.errors.PyMongoError:
    # The ChangeStream encountered an unrecoverable error or the
    # resume attempt failed to recreate the cursor.
    logging.error('...')

См. Также pymongo.mongo_client.MongoClient. смотреть ()

4
Wan Bachtiar 3 Дек 2018 в 06:23

Немного поздно, но вы можете сделать это без настройки реплики, используя следующее: наивысший предыдущий первичный ключ = 0

В то время как True: cursor = collection.find () для документа в курсоре:

    # get the current primary key, and if it's greater than the previous one
    # we print the results and increment the variable to that value
    current_primary_key = collection.count()
    if current_primary_key > highest_previous_primary_key:
        curs = collection.find()
        curs[highest_previous_primary_key:]
        for i in curs:
            print(i)
        highest_previous_primary_key = current_primary_key
0
alif 26 Фев 2021 в 11:15