-
Notifications
You must be signed in to change notification settings - Fork 109
/
Copy pathdocstore.py
88 lines (55 loc) · 2.54 KB
/
docstore.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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
"""Functions to connect to a document store and fetch documents from it."""
CONFIG = {"MONGO_DATABASE": "fsdl-dev", "MONGO_COLLECTION": "ask-fsdl"}
def get_documents(collection=None, db=None, client=None, query=None):
"""Fetches a collection of documents from a document database."""
collection = get_collection(collection, db, client)
query = query or {"metadata.ignore": False}
docs = collection.find(query)
return docs
def drop(collection=None, db=None, client=None):
"""Drops a collection from the database."""
collection = get_collection(collection, db, client)
collection.drop()
def query(query, projection=None, collection=None, db=None):
"""Runs a query against the document db and returns a list of results."""
import docstore
collection = docstore.get_collection(collection, db)
return list(collection.find(query, projection))
def query_one(query, projection=None, collection=None, db=None):
"""Runs a query against the document db and returns the first result."""
import docstore
collection = docstore.get_collection(collection, db)
return collection.find_one(query, projection)
def get_collection(collection=None, db=None, client=None):
"""Accesses a specific collection in the document store."""
import pymongo
db = get_database(db, client)
collection = collection or CONFIG["MONGO_COLLECTION"]
if isinstance(collection, pymongo.collection.Collection):
return collection
else:
collection = db.get_collection(collection)
return collection
def get_database(db=None, client=None):
"""Accesses a specific database in the document store."""
import pymongo
client = client or connect()
db = db or CONFIG["MONGO_DATABASE"]
if isinstance(db, pymongo.database.Database):
return db
else:
db = client.get_database(db)
return db
def connect(user=None, password=None, uri=None):
"""Connects to the document store, here MongoDB."""
import os
import urllib
import pymongo
mongodb_user = user or os.environ["MONGODB_USER"]
mongodb_user = urllib.parse.quote_plus(mongodb_user)
mongodb_password = password or os.environ["MONGODB_PASSWORD"]
mongodb_password = urllib.parse.quote_plus(mongodb_password)
mongodb_host = uri or os.environ["MONGODB_HOST"]
connection_string = f"mongodb+srv://{mongodb_user}:{mongodb_password}@{mongodb_host}/?retryWrites=true&w=majority"
client = pymongo.MongoClient(connection_string, connect=True, appname="ask-fsdl")
return client