Add MongoDB support

This commit is contained in:
2026-04-20 16:12:23 +03:00
parent aa974ce1b4
commit 95768e8dfd
4 changed files with 66 additions and 3 deletions
+6 -1
View File
@@ -21,4 +21,9 @@ AGE_GRAPH_NAME=movie_graph
INFLUX_ACTIVE=false INFLUX_ACTIVE=false
INFLUXDB3_HOST=http://localhost:8181 INFLUXDB3_HOST=http://localhost:8181
INFLUXDB3_AUTH_TOKEN=your_token INFLUXDB3_AUTH_TOKEN=your_token
INFLUXDB3_DATABASE=sensors INFLUXDB3_DATABASE=sensors
MONGO_ACTIVE=false
MONGO_URI=mongodb://localhost:27017
MONGO_DB=movie_data
MONGO_COLLECTION=movies
+9 -2
View File
@@ -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 — графовая БД - Neo4j — графовая БД
- Apache AGE — графовая БД в рамках PostgreSQL - Apache AGE — графовая БД в рамках PostgreSQL
- InfluxDB 3 Core — БД временных рядов - InfluxDB 3 Core — БД временных рядов
- MongoDB (pymongo) — документ-ориентированная БД
### Скриншоты ### Скриншоты
@@ -27,6 +28,7 @@
- Установленный Neo4j и загруженный обучающий граф фильмов (Movie Graph example) - Установленный Neo4j и загруженный обучающий граф фильмов (Movie Graph example)
- Для Apache AGE: установленное расширение `age` в PostgreSQL и доступ к базе, где оно включено - Для Apache AGE: установленное расширение `age` в PostgreSQL и доступ к базе, где оно включено
- Для InfluxDB 3 Core: запущенный сервер, заранее созданная база и токен с правами на запись и чтение - Для InfluxDB 3 Core: запущенный сервер, заранее созданная база и токен с правами на запись и чтение
- Для MongoDB: запущенный MongoDB сервер и доступ к целевой базе
### Настройка окружения ### Настройка окружения
@@ -60,6 +62,11 @@ INFLUX_ACTIVE=false # включить InfluxDB 3 Core, установив tru
INFLUXDB3_HOST=http://localhost:8181 INFLUXDB3_HOST=http://localhost:8181
INFLUXDB3_AUTH_TOKEN=your_token INFLUXDB3_AUTH_TOKEN=your_token
INFLUXDB3_DATABASE=sensors INFLUXDB3_DATABASE=sensors
MONGO_ACTIVE=false # включить MongoDB, установив true
MONGO_URI=mongodb://localhost:27017
MONGO_DB=movie_data
MONGO_COLLECTION=movies
``` ```
2. Создайте и активируйте виртуальное окружение: 2. Создайте и активируйте виртуальное окружение:
@@ -94,4 +101,4 @@ pip install -r requirements.txt
py main.py py main.py
``` ```
Для PostgreSQL, Neo4j, Apache AGE и InfluxDB 3 Core запросы также выполняются только при `*_ACTIVE=true`. Для PostgreSQL, Neo4j, Apache AGE, InfluxDB 3 Core и MongoDB запросы выполняются только при `*_ACTIVE=true`.
+50
View File
@@ -1,3 +1,4 @@
import importlib
import os import os
import sys import sys
@@ -10,6 +11,8 @@ from psycopg2.errors import DuplicateDatabase
from PyQt5.QtCore import QSize, Qt from PyQt5.QtCore import QSize, Qt
from PyQt5.QtWidgets import QApplication, QGridLayout, QHeaderView, QMainWindow, QTableWidget, QTableWidgetItem, QWidget from PyQt5.QtWidgets import QApplication, QGridLayout, QHeaderView, QMainWindow, QTableWidget, QTableWidgetItem, QWidget
MongoClient = importlib.import_module("pymongo").MongoClient
load_dotenv() load_dotenv()
POSTGRES_USER = os.getenv("POSTGRES_USER") 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_AUTH_TOKEN = os.getenv("INFLUXDB3_AUTH_TOKEN")
INFLUXDB3_DATABASE = os.getenv("INFLUXDB3_DATABASE", "sensors") 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 = [ USER_SEED_DATA = [
(1, "Ivan", 15), (1, "Ivan", 15),
(2, "Igor", 22), (2, "Igor", 22),
@@ -203,6 +211,34 @@ ORDER BY time, measurement
return headers, values 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(): def load_users():
admin_conn = connect_postgres("postgres") admin_conn = connect_postgres("postgres")
try: try:
@@ -378,4 +414,18 @@ if __name__ == "__main__":
except Exception as error: except Exception as error:
print(f"InfluxDB 3 Core load failed: {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()) sys.exit(app.exec())
+1
View File
@@ -3,3 +3,4 @@ neo4j
PyQt5 PyQt5
python-dotenv python-dotenv
influxdb3-python influxdb3-python
pymongo