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