ich habe eine Funktion get_data_of_imei(). Diese Funktion soll ich so umschreiben, dass ich von MongoDB die Aggeragtsfunktion nutzen soll. Der Hintergrund ist, dass die Funktion get_data_of_imei zwar das richtige Ergebnis liefert, aber deutlich zu langsam ist. Hier ist die Funktion:
Code: Alles auswählen
def get_data_of_imei(imei: str) -> list:
# Collection where incoming streams are saved
db.set_collection("tracking")
# filter streams by imei
datas = db.find_document_by_parameter({"imei": imei})
# list of numeric keys (these keys have to delete)
del_list = []
for data in datas:
for key in list(data.keys()):
if key.isdigit():
# search description of numeric keys
db.set_collection("trackerIDs")
tmp = db.find_document_by_parameter({"Property ID in AVL packet": int(key)})
# if key is found, add it with the value of this numeric key
if tmp and len(tmp) > 0:
k = tmp[0]['Property Name']
data[k] = data[key]
del_list.append(str(key))
# remove all numerics keys
for i in range(0, len(datas)):
del datas[i]["_id"]
for dl in del_list:
if dl in datas[i]:
del datas[i][dl]
return datas
Code: Alles auswählen
from pymongo import MongoClient
class DB:
def __init__(self, connection):
client = MongoClient(
f"mongodb://{connection['user']}:{connection['pw']}@{connection['ip']}:{connection['port']}/")
self.db = client[connection['d_db']]
self.collection = self.db[connection['d_collection']]
def set_collection(self, collection) -> None:
self.collection = self.db[collection]
def set_document(self, document) -> int:
return self.collection.insert_one(document).inserted_id
def find_document_by_parameter(self, parameter, limit: int = -1) -> list:
return list(self.collection.find(parameter) if limit < 1 else self.collection.find(parameter).limit(limit))
def find_all_documents(self) -> list:
return list(self.collection.find())
def delete_document(self, parameter) -> int:
return self.collection.delete_many(parameter).deleted_count
def update_document(self, parameter, new_value) -> int:
return self.collection.update_many(parameter, new_value).modified_count
def get_current_collection(self) -> str:
return self.collection.name
def get_value_by_aggregate(self, aggregate):
return self.collection.aggregate(aggregate)
In der Mongo DB sind 2 Sammlungen: "trackerIDs" und "tracking"
Auszug aus "trackerIDs":
Code: Alles auswählen
[
{
"_id": "64b0fec445c13fbbd834f9f4",
"Bytes": "1",
"Description": "Logic: 0/1",
"HW Support": "FMBXXX FMB001\nFMB010\nFMB110\nFMB120\nFMB122\nFMB125\nFMU125\nFMC125\nFMM125\nFMB130\nFMU130\nFMC130\nFMM130\nFMB140\nFMB900\nFMB920\nFMB962\nFMB964\nFMB202\nFMB204\nFMB206\nMTB100",
"Max": "1",
"Min": "0",
"Multiplier": "",
"Parameter Group": "Permanent I/O elements",
"Property ID in AVL packet": "1",
"Property Name": "Digital Input 1",
"Type": "Unsigned",
"Units": ""
},
{
"_id": "64b0fec545c13fbbd834f9f5",
"Bytes": "1",
"Description": "Logic: 0/1",
"HW Support": "FMBXXX FMB110\nFMB120\nFMB122\nFMB125\nFMU125\nFMC125\nFMM125\nFMB130\nFMU130\nFMC130\nFMM130\nFMB140\nFMB202\nFMB204\nFMB206\nFMB640",
"Max": "1",
"Min": "0",
"Multiplier": "",
"Parameter Group": "Permanent I/O elements",
"Property ID in AVL packet": "2",
"Property Name": "Digital Input 2",
"Type": "Unsigned",
"Units": ""
}]
Code: Alles auswählen
[
{
"_id": "64b6624aef973d34f38b8d81",
"11": "893407150",
"14": "4460403",
"16": "72586",
"21": "4",
"24": "0",
"67": "4290",
"68": "0",
"69": "2",
"113": "100",
"116": "1",
"181": "0",
"182": "0",
"200": "0",
"205": "56380",
"240": "0",
"241": "26203",
"altitude": "0",
"angle": "0",
"imei": "350317178147371",
"latitude": "0",
"longitude": "0",
"priority": "0",
"satellites": "0",
"speed": "0",
"timestamp": "1689674310000"
},
{
"_id": "64b6624aef973d34f38b8d83",
"11": "893407150",
"14": "4460403",
"16": "72586",
"21": "4",
"24": "0",
"67": "4290",
"68": "0",
"69": "2",
"113": "100",
"116": "1",
"181": "0",
"182": "0",
"200": "0",
"205": "56380",
"240": "0",
"241": "26203",
"altitude": "0",
"angle": "0",
"imei": "350317178147371",
"latitude": "0",
"longitude": "0",
"priority": "0",
"satellites": "0",
"speed": "0",
"timestamp": "1689674308000"
}]
Hierbei gilt, dass die nummerischen Keys in der Sammlung "tracking" durch "Property ID in AVL packet" aus der Sammlung "trackerIDs" definiert ist. Diese Nummerischen Keys aus tracking sollen durch den Wert in "Description" ersetzt werden.
Das Ergebnis aus der Funktion get_data_of_imei() ist:
Code: Alles auswählen
[
{
"Active GSM Operator": 26203,
"Battery Current": 0,
"Battery Level": 100,
"Battery Voltage": 4290,
"GNSS HDOP": 0,
"GNSS PDOP": 0,
"GNSS Status": 2,
"GSM Cell ID": 56380,
"GSM Signal": 4,
"ICCID1": 893407150,
"ICCID2": 4460403,
"Movement": 0,
"Sleep Mode": 0,
"Speed": 0,
"Total Odometer": 72586,
"altitude": 0,
"angle": 0,
"imei": "{imei}",
"latitude": 0,
"longitude": 0,
"priority": 0,
"satellites": 0,
"speed": 0,
"timestamp": {timestamp},
"unknown": 1
}]
Glückauf aus dem Ruhrgebiet
Tobias
PS.: ChatGPT ist an dieser Aufgabe gescheitert.