from typing import List from pymongo.asynchronous.database import AsyncDatabase class DbService: def __init__(self, dbStore): self.dbStore:AsyncDatabase = dbStore async def listOfNodes(self): pipeline = [ #ai slooop # Сортировка для каждого num по убыванию ts {"$sort": {"num": 1, "ts": -1}}, # Группировка по num и взятие первого (последнего) документа {"$group": { "_id": "$num", "latest_doc": {"$first": "$$ROOT"} }}, # Замена корневого документа {"$replaceRoot": {"newRoot": "$latest_doc"}}, # Сортировка результата (опционально) {"$sort": {"num": 1}} ] collection = self.dbStore['node_info'] c = await collection.aggregate(pipeline) return await c.to_list() async def listOfDirectNodes(self): pipeline = [ #ai slooop {"$match": {"hops_away": 0}}, # Фильтруем по списку # Сортировка для каждого num по убыванию ts {"$sort": {"num": 1, "ts": -1}}, # Группировка по num и взятие первого (последнего) документа {"$group": { "_id": "$num", "latest_doc": {"$first": "$$ROOT"} }}, # Замена корневого документа {"$replaceRoot": {"newRoot": "$latest_doc"}}, # Сортировка результата (опционально) {"$sort": {"num": 1}} ] collection = self.dbStore['node_info'] c = await collection.aggregate(pipeline) return await c.to_list() async def oneNode(self, num: int): collection = self.dbStore['node_info'] c = await collection.find_one( {"num":num}, sort=[("ts", -1)] ) return c async def listOfSelectedNodes(self, nums: List[int]): pipeline = [ {"$match": {"num": {"$in": nums}}}, # Фильтруем по списку {"$sort": {"num": 1, "ts": -1}}, # Сортируем по num и ts (по убыванию) { "$group": { "_id": "$num", # Группируем по num "latest_doc": {"$first": "$$ROOT"} # Берем первую (последнюю по ts) } }, {"$replaceRoot": {"newRoot": "$latest_doc"}}, # Восстанавливаем структуру {"$sort": {"num": 1}} # Сортируем результат по num ] collection = self.dbStore['node_info'] c = await collection.aggregate(pipeline) return await c.to_list() async def listOfFindLikeName(self, long_name): pipeline = [ {"$match": {"long_name": {"$regex":long_name ,'$options' : 'i'}}}, # Фильтруем по списку {"$sort": {"num": 1, "ts": -1}}, # Сортируем по num и ts (по убыванию) { "$group": { "_id": "$num", # Группируем по num "latest_doc": {"$first": "$$ROOT"} # Берем первую (последнюю по ts) } }, {"$replaceRoot": {"newRoot": "$latest_doc"}}, # Восстанавливаем структуру {"$sort": {"num": 1}} # Сортируем результат по num ] collection = self.dbStore['node_info'] c = await collection.aggregate(pipeline) return await c.to_list()