Last active
February 3, 2023 11:41
-
-
Save athyk/7e97e4c704be040e2f3b3f327c9b36ae to your computer and use it in GitHub Desktop.
pymongo basic schema
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import datetime | |
import pymongo | |
database = pymongo.MongoClient("mongodb://localhost:27017") # Mongodb connection | |
db = database.maindb # Database | |
posts = db.items # Collection within a database | |
# A schema equivalent function that returns the object | |
def user_details(name, dob): | |
return { | |
"username": name, # a username/id | |
"dob": dob, # some data | |
"level": 0, # some other data | |
"latest_update": datetime.datetime.fromtimestamp(1615640176) | |
# Must be kept to ensure you aren't doing it that often | |
} | |
# The first schema changed for example after adding a new feature | |
def user_details2(name, dob, cake): | |
return { | |
"username": name, # a username/id | |
"dob": dob, # Some data | |
"level": 0, # Some other data | |
"cake": cake, # Some new data that isn't in the document | |
"latest_update": datetime.datetime.utcnow() # Must be kept to ensure you aren't doing it that often | |
} | |
def check_if_update(find, main_document, | |
collection): # parameters: What you find a document with, the schema dictionary, then the mongodb collection | |
if collection.count_documents(find) > 0: # How many documents match, only proceed if it exists | |
fields = {} # Init a dictionary | |
for x in collection.find(find): # You only want one for this to work | |
fields = x | |
if "latest_update" in fields: # Just in case it doesn't exist yet | |
last_time = fields["latest_update"] # Get the time that it was last updated | |
time_diff = datetime.datetime.utcnow() - last_time # Get the time difference between the utc time now and the time it was last updated | |
if time_diff.total_seconds() < 3600: # If the total seconds of the difference is smaller than an hour | |
print("return") | |
return | |
db_schema = main_document # Better naming | |
db_schema["_id"] = 0 # Adds the _id schema_key into the dictionary | |
if db_schema.keys() != fields: | |
print("in") | |
for schema_key, schema_value in db_schema.items(): | |
if schema_key not in fields.keys(): # Main key for example if cake is added and doesn't exist in db fetched fields | |
collection.update_one(find, {"$set": {schema_key: schema_value}}) | |
else: # Everything exists and you want to check for if a dictionary within that dictionary is changed | |
try: | |
sub_dict = dict(schema_value) # Make the value of it a dictionary | |
# It exists in the schema dictionary but not in the db fetched document | |
for key2, value2 in sub_dict.items(): | |
if key2 not in fields[schema_key].keys(): | |
new_value = schema_value | |
new_value[ | |
key2] = value2 # Adding the key and value from the schema dictionary that was added | |
collection.update_one(find, | |
{"$set": {schema_key: new_value}}) | |
# It exists in the db fetched document but not in the schema dictionary | |
for key2, value2 in fields[schema_key].items(): | |
if key2 not in sub_dict.keys(): | |
new_dict = {} # Get all values, filter then so that only the schema existent ones are passed back | |
for item in sub_dict: | |
if item != key2: | |
new_dict[item] = sub_dict.get(item) | |
collection.update_one(find, {"$set": {schema_key: new_dict}}) | |
except: # Wasn't a dict | |
pass | |
# You removed a value from the schema dictionary and want to update it in the db | |
for key2, value2 in fields.items(): | |
if key2 not in db_schema: | |
collection.update_one(find, {"$unset": {key2: 1}}) | |
else: | |
collection.insert_one(main_document) # Insert it because it doesn't exist yet | |
print("start") | |
print(posts.find_one({"username": "john"})) | |
check_if_update({"username": "john"}, user_details("john", "13/03/2021"), posts) | |
print("inserted") | |
print(posts.find_one({"username": "john"})) | |
check_if_update({"username": "john"}, user_details2("john", "13/03/2021", "Lemon drizzle"), posts) | |
print("Results:") | |
print(posts.find_one({"username": "john"})) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment