-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdatabase.py
54 lines (44 loc) · 1.84 KB
/
database.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
from motor.motor_asyncio import AsyncIOMotorClient
from model import as_film, as_player
from logger import CustomLogger
from typing import Optional
class Database:
def __init__(self, uri: str = "mongodb://localhost:27017", timeout: int = 5):
self.logger = CustomLogger("db_logger", "logs/db.log")
conn = AsyncIOMotorClient(uri, socketTimeoutMS=timeout * 1000)
self.crew_coll = conn.get_database("imdb").get_collection("crew")
self.film_coll = conn.get_database("imdb").get_collection("films")
async def get_random_film(self):
step = { "$sample": { "size": 1 } }
cursor = self.film_coll.aggregate([step])
result = await cursor.to_list(length=1)
if result:
return as_film(result[0])
else:
self.logger.error("Couldn't get a random film")
return None
async def get_random_player(self):
step = { "$sample": { "size": 1 } }
cursor = self.crew_coll.aggregate([step])
result = await cursor.to_list(length=1)
if result:
return as_player(result[0])
else:
self.logger.error("Couldn't get a random player")
return None
async def get_player(self, name: str):
_filter = { "primaryName": { "$regex": name, "$options": "i" } }
result = await self.crew_coll.find_one(_filter)
if result:
return as_player(result)
else:
self.logger.error(f"Couldn't get a player by name {name}")
return None
async def get_film(self, title: str):
_filter = { "primaryTitle": { "$regex": title, "$options": "i" } }
result = await self.film_coll.find_one(_filter)
if result:
return as_film(result)
else:
self.logger.error(f"Couldn't get a film by title {title}")
return None