diff --git a/.env_example b/.env_example index b08ee57..8faa0cd 100644 --- a/.env_example +++ b/.env_example @@ -21,4 +21,9 @@ AGE_GRAPH_NAME=movie_graph INFLUX_ACTIVE=false INFLUXDB3_HOST=http://localhost:8181 INFLUXDB3_AUTH_TOKEN=your_token -INFLUXDB3_DATABASE=sensors \ No newline at end of file +INFLUXDB3_DATABASE=sensors + +MONGO_ACTIVE=false +MONGO_URI=mongodb://localhost:27017 +MONGO_DB=movie_data +MONGO_COLLECTION=movies \ No newline at end of file diff --git a/README.md b/README.md index dd69f78..ba9e5d7 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ### Пример приложения для работы с БД -Небольшое десктоп-приложение на PyQt5 для работы с PostgreSQL, Neo4j, Apache AGE и InfluxDB 3 Core. +Небольшое десктоп-приложение на PyQt5 для работы с PostgreSQL, Neo4j, Apache AGE, InfluxDB 3 Core и MongoDB. ### Стек @@ -9,6 +9,7 @@ - Neo4j — графовая БД - Apache AGE — графовая БД в рамках PostgreSQL - InfluxDB 3 Core — БД временных рядов +- MongoDB (pymongo) — документ-ориентированная БД ### Скриншоты @@ -27,6 +28,7 @@ - Установленный Neo4j и загруженный обучающий граф фильмов (Movie Graph example) - Для Apache AGE: установленное расширение `age` в PostgreSQL и доступ к базе, где оно включено - Для InfluxDB 3 Core: запущенный сервер, заранее созданная база и токен с правами на запись и чтение +- Для MongoDB: запущенный MongoDB сервер и доступ к целевой базе ### Настройка окружения @@ -60,6 +62,11 @@ INFLUX_ACTIVE=false # включить InfluxDB 3 Core, установив tru INFLUXDB3_HOST=http://localhost:8181 INFLUXDB3_AUTH_TOKEN=your_token INFLUXDB3_DATABASE=sensors + +MONGO_ACTIVE=false # включить MongoDB, установив true +MONGO_URI=mongodb://localhost:27017 +MONGO_DB=movie_data +MONGO_COLLECTION=movies ``` 2. Создайте и активируйте виртуальное окружение: @@ -94,4 +101,4 @@ pip install -r requirements.txt py main.py ``` -Для PostgreSQL, Neo4j, Apache AGE и InfluxDB 3 Core запросы также выполняются только при `*_ACTIVE=true`. \ No newline at end of file +Для PostgreSQL, Neo4j, Apache AGE, InfluxDB 3 Core и MongoDB запросы выполняются только при `*_ACTIVE=true`. \ No newline at end of file diff --git a/main.py b/main.py index 494c833..0778ede 100644 --- a/main.py +++ b/main.py @@ -1,3 +1,4 @@ +import importlib import os import sys @@ -10,6 +11,8 @@ from psycopg2.errors import DuplicateDatabase from PyQt5.QtCore import QSize, Qt from PyQt5.QtWidgets import QApplication, QGridLayout, QHeaderView, QMainWindow, QTableWidget, QTableWidgetItem, QWidget +MongoClient = importlib.import_module("pymongo").MongoClient + load_dotenv() POSTGRES_USER = os.getenv("POSTGRES_USER") @@ -37,6 +40,11 @@ INFLUXDB3_HOST = os.getenv("INFLUXDB3_HOST", "http://localhost:8181") INFLUXDB3_AUTH_TOKEN = os.getenv("INFLUXDB3_AUTH_TOKEN") INFLUXDB3_DATABASE = os.getenv("INFLUXDB3_DATABASE", "sensors") +MONGO_ACTIVE = os.getenv("MONGO_ACTIVE", "false").lower() == "true" +MONGO_URI = os.getenv("MONGO_URI", "mongodb://localhost:27017") +MONGO_DB = os.getenv("MONGO_DB", "movie_data") +MONGO_COLLECTION = os.getenv("MONGO_COLLECTION", "movies") + USER_SEED_DATA = [ (1, "Ivan", 15), (2, "Igor", 22), @@ -203,6 +211,34 @@ ORDER BY time, measurement return headers, values +def connect_mongo(): + return MongoClient(MONGO_URI) + + +def insert_mongo_movies(collection): + if collection.count_documents({}) > 0: + print("MongoDB collection is already seeded.") + return + + collection.insert_many( + [ + {"title": "Apollo 13", "released": 1995}, + {"title": "The Matrix", "released": 1999}, + {"title": "Toy Story", "released": 1995}, + {"title": "Alien", "released": 1979}, + ] + ) + print("MongoDB movies inserted.") + + +def select_mongo_movies(collection): + cursor = collection.find( + {"released": {"$gte": 1990, "$lt": 2000}}, + {"_id": 0, "title": 1}, + ).sort("title", 1) + return [document["title"] for document in cursor] + + def load_users(): admin_conn = connect_postgres("postgres") try: @@ -378,4 +414,18 @@ if __name__ == "__main__": except Exception as error: print(f"InfluxDB 3 Core load failed: {error}") + if MONGO_ACTIVE: + try: + with connect_mongo() as mongo_client: + movies_collection = mongo_client[MONGO_DB][MONGO_COLLECTION] + insert_mongo_movies(movies_collection) + mongo_movies = select_mongo_movies(movies_collection) + + mongo_window = DataWindow("mongodb", ["Info"], main_window, len(graph_windows)) + mongo_window.load_data([(title,) for title in mongo_movies]) + mongo_window.show() + graph_windows.append(mongo_window) + except Exception as error: + print(f"MongoDB load failed: {error}") + sys.exit(app.exec()) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 45dc001..f629d37 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,3 +3,4 @@ neo4j PyQt5 python-dotenv influxdb3-python +pymongo