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
INFLUXDB3_HOST=http://localhost:8181
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 — графовая БД
- 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`.
Для PostgreSQL, Neo4j, Apache AGE, InfluxDB 3 Core и MongoDB запросы выполняются только при `*_ACTIVE=true`.
+50
View File
@@ -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())
+1
View File
@@ -3,3 +3,4 @@ neo4j
PyQt5
python-dotenv
influxdb3-python
pymongo