6 changed files with 113 additions and 71 deletions
@ -0,0 +1,87 @@ |
|||||
|
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() |
||||
Loading…
Reference in new issue