Wie der Name bereits verrät ist database.py für die Interaktion mit unserer Datenbank verantwortlich.

from pymongo import MongoClient as MC
import datetime as dt
import certifi



cluster = MC("[auth-string]", tlsCAFile=certifi.where())
db = cluster["unisensor"]
measuring_station = db["Messstation"]

class Database():

    def insert_dataset(dataset: dict) -> None:
        measuring_station.insert_one(dataset)
        
    
    def insert_datasets(datasets: list) -> None:
        measuring_station.insert_many(datasets)
    
    def get_data(type:str):
        # Calculate timestamp for start // now - 7 days
        start_date = dt.datetime.today() + dt.timedelta(weeks=-1)
        # Query data that was added after start date
        data = [(x["date"], x[type]) for x in measuring_station.find({"date" : {"$gt":start_date}},
        {
            "date" : 1,
            "_id" : 0,
            type : 1
        })]
        return data

In den ersten 3 Zeilen von database.py werden alle nötigen Module importiert. Diese sind pymongo, ein Modul zur Kommunikation mit der MongoDB Datenbank, datetime um timestamps zu kreieren und certifi um einen Zertifikat zu kreieren das dabei hilft die Identität des TLS Hosts zu verifizieren. TLS auch Transport Layer Security ist ein Verfahren, das die Daten welche vom Backend an die Datenbank gesendet werden verschlüsselt, sodass wirklich nur Sender und Empfänger etwas mit diesen Daten anfangen können.

Als nächstes wird ein Client erstellt der für die Interaktion mit der Datenbank benutzt wird. Dafür wird der von pymongo importierten Klasse MongoClient der Authentifizierungsstring, diesen erhält man beim erstellen der Datenbank von MongoDB, sowie das certifi Zertifikat übergeben. Der Client wird dann unter der Variabel “cluster” gespeichert. MongoDB ist in drei Ebenen aufgeteilt die obere Ebene ist der Cluster, ein Cluster kann mehrere Datenbanken haben unter eine Datenbank mehrere Kollektionen. Unter “db” wird die Datenbank “Unisensor” als Variabel gespeichert und unter “measuring_station” schließlich die Kollektion “Messstation” in diese Kollektion werden die Messergebnisse unseres Sensors geschrieben. Hierbei würde jeder weitere Universalsensor eine eigene Kollektion bekommen.

Die Database Klasse

Die Database Klasse besteht aus drei Methoden.

insert_dataset(dataset):

insert dataset wird ein python dictionary übergeben und dieses wird anschließend mit dem Befehl “measuring_station.insert_one(dataset)” in die Kollektion Messstation der Datenbank geschrieben.

insert_datasets(datasets):

Funktioniert analog zu insert_dataset. Nur wird hier eine Liste von dictionaries übergeben die dann alle in die Kollektion Messstation geschrieben werden.

get_data(type):

Der get_data methode wird ein String übergeben wie zum Beispiel “temperature”. Die “start_date” Variabel erhält einen Timestamp der aus dem aktuellen Datum + Zeit minus einer Woche besteht.
Im zweiten Teil der Methode wird nun die Datenbank nach Eintragen durchsucht die dem angegebenen String enthalten und nach dem “start_date” in die Kollektion measuring_station eingefügt wurde, dabei wird gleichzeitig eine Liste von Tuplen mit den Ergebnissen erstellt.

data = [(x["date"], x[type]) for x in measuring_station.find({"date" : {"$gt":start_date}},{"date" : 1, "_id" : 0, type : 1})]

(x[“date”], x[type]) ist das Format eines einzelnen Tuples in der Liste wobei x für jedes Ergebnis der Funktion:

measuring_station.find({"date" : {"$gt":start_date}},{"date" : 1, "_id" : 0, type : 1})

steht. Diese Methode “findet” Einträge in der Kollektion bei denen das “date” field größer als, $gt, das “start_date” ist. Der Block in den geschweiften Klammern nach dem Komma {“date” : 1, “id” : 0, type : 1} formatiert das Ergebnis der Methode. Eine 1 hinter einem Feld bedeutet, dass dieses Feld ausgegeben wird. Eine 0 das es ignoriert wird. Standartmäßig sind alle Felder außer das Feld “_id” auf 0 gesetzt. Das Ergebnis dieser Funktion für “temperature” sieht also wie folgt aus:

[{
"date" : dateobject
"temperature" : 23
},
"date" : dateobject
"temperature" : 24
},
...
]

Nun ist auch klar was in ein Tuple der Form (x[“date”], x[type]) geschrieben wird. Und zwar das dateobject und dann der Wert des Type Strings. Zum Beispiel für “temperature” könnte ein Tuple so aussehen: (15.07.2022 14:51:30, 20).
Ein solches Tuple wird für jedes Ergebnis von measuring_station.find() erzeugt und in eine Liste geschrieben.
Die Variabel “data” die auch zurückgegeben wird enthält am Ende also eine Liste die in etwas so aussieht für “temperatur”:

[(15.07.2022 14:51:30, 20),(15.07.2022 14:52:30, 20),(15.07.2022 14:53:30, 21)]

Tags:

No responses yet

Leave a Reply

Your email address will not be published. Required fields are marked *